Maj*_*cRa 17 python exception-handling importerror pycharm
try:
import MySQLdb
# some action
except ImportError as err:
# fallback code
Run Code Online (Sandbox Code Playgroud)
PyCharm给出了代码检查警告:
"除了ImportError"的try块中的'MySQLdb'也应该在除块之外定义
此检查检测应解决但不能解析的名称.由于动态调度和鸭子打字,这在有限但有用的情况下是可能的.顶级和类级别项比实例项更受支持.
好吧,我认为警告是合理的,因为fallback code假设没有安装'MySQLdb',而它可能是一些不同的错误,只是引发了ImportError.所以我使用了类似的东西:
try:
import MySQLdb
# some action
except ImportError as err:
if "MySQLdb" in repr(err):
# fallback code
else:
raise
Run Code Online (Sandbox Code Playgroud)
PyCharm警报仍然存在,但它可能只是一个PyCharm问题(谷歌显示此类检查的问题)
问题:
当你"除了ImportError"之外,真的值得检查名字吗?即使在简单的情况下(没有some action之后import MySQLdb)?
如果值得检查,上面的例子是正确的方法吗?如果不是 - 什么是正确的方法?
PS MySQLdb只是系统中可能缺少的模块的一个示例.
Tad*_*sen 20
我认为您误解了警告,如果您没有定义MySQLdb在except块中调用的变量,那么稍后当您尝试使用该模块时,您会得到NameError:
try:
import foo
except ImportError:
pass
foo.say_foo() #foo may or may not be defined at this point!
Run Code Online (Sandbox Code Playgroud)
如果该模块仅用于该try:子句,那么这不是问题.但是对于更一般的情况,检查器希望您在except块中定义变量:
try:
import foo
except ImportError:
foo = None #now foo always exists
if foo: #if the module is present
foo.say_foo()
else:
print("foo") #backup use
Run Code Online (Sandbox Code Playgroud)