首页 > 解决方案 > Netaddr 返回 NameError 而不是 ImportError

问题描述

netaddr python 模块跳过 ImportError。我必须创建一个函数来使用 try/finally 来捕获 ImportError,然后重做 try/except 以返回打印值。想知道是否有更简单的方法来捕获 ImportError?

import json
import base64
try:
    netaddr_mod()
except:
    print("ImportError: pip install netaddr")

def netaddr_mod():
    try:
        import netaddr
    finally:
        import netaddr 

我在全局变量中看到了一些其他修复,但没有与此导入修复类似。找到一个更简单的方法来解决这个问题会很棒,但这种方法现在可以工作。

标签: pythonerror-handlingimporterror

解决方案


def在 Python 中,函数在语句定义之前不存在。所以如果你在定义它之前调用它,你会得到一个NameError.

所以,在你尝试调用它netaddr_mod() 之前定义它。否则代码的第 4 行将引发NameError. 该消息说它是一个ImportError但您的代码实际上并没有检查异常是什么。如果您像这样修改代码:

try:
    netaddr_mod()
except:
    print("ImportError: pip install netaddr")
    raise

你会得到

ImportError: pip install netaddr
Traceback (most recent call last):
  File "<pyshell#50>", line 2, in <module>
    netaddr_mod()
NameError: name 'netaddr_mod' is not defined

在这里,您会看到有关ImportError您认为是的消息,然后是告诉您异常的真正含义的回溯。

道德:不要使用裸异常,因为它们会掩盖或误报代码的其他问题。except ImportError:如果您试图捕获导入错误,请执行显式操作。然后,如果您遇到不同的异常,您至少会知道它是什么。


推荐阅读