我应该在定义函数的模块中定义try,还是在Python中调用函数的模块中定义try?
假设我有以下两个模块: a.py:我应该在定义函数的模块中定义try,还是在Python中调用函数的模块中定义try?,python,try-catch,Python,Try Catch,假设我有以下两个模块: a.py: def connect(): bla bla bla.. def connect(): try: bla bla bla.. except: bla bla bla.. from a import connect try: connect() except: bla bla bla.. def connect(): try: bla
def connect():
bla bla bla..
def connect():
try:
bla bla bla..
except:
bla bla bla..
from a import connect
try:
connect()
except:
bla bla bla..
def connect():
try:
bla bla bla..
except ValueError:
bla bla bla..
from a import connect
try:
connect()
except Exception, e:
bla bla bla..
b.py:
from a import connect
connect()
我应该在模块a
或b
中为connect()
定义try-except子句吗
所以
a.py:
def connect():
bla bla bla..
def connect():
try:
bla bla bla..
except:
bla bla bla..
from a import connect
try:
connect()
except:
bla bla bla..
def connect():
try:
bla bla bla..
except ValueError:
bla bla bla..
from a import connect
try:
connect()
except Exception, e:
bla bla bla..
或
b.py:
def connect():
bla bla bla..
def connect():
try:
bla bla bla..
except:
bla bla bla..
from a import connect
try:
connect()
except:
bla bla bla..
def connect():
try:
bla bla bla..
except ValueError:
bla bla bla..
from a import connect
try:
connect()
except Exception, e:
bla bla bla..
?
顺便说一句,如果我尝试“嵌套”,除了
,会发生什么
a.py:
def connect():
bla bla bla..
def connect():
try:
bla bla bla..
except:
bla bla bla..
from a import connect
try:
connect()
except:
bla bla bla..
def connect():
try:
bla bla bla..
except ValueError:
bla bla bla..
from a import connect
try:
connect()
except Exception, e:
bla bla bla..
b.py:
def connect():
bla bla bla..
def connect():
try:
bla bla bla..
except:
bla bla bla..
from a import connect
try:
connect()
except:
bla bla bla..
def connect():
try:
bla bla bla..
except ValueError:
bla bla bla..
from a import connect
try:
connect()
except Exception, e:
bla bla bla..
两者似乎都运转良好。我倾向于将try/catch保持在尽可能低的级别(接近原始错误源),以便在可以帮助的情况下保持主代码相对清晰 此外,对于上一个示例,b.py的方法将捕获任何异常。这可能是您想要的,但不是最好的行为,因为它可能会捕捉到您可能希望以更具体的方式处理的奇怪事情 我应该在模块a或b中为connect()定义try-except子句吗 这实际上取决于用例,我的意思是当您可能认为可能存在错误时,始终使用try-catch语句。 我认为在
b.py
中使用try catch
并不是最佳选择,因为它更简单。基本上,问问自己代码最有可能失败的地方是哪里
我的意思是,在您的特定示例中,它似乎表明connect
函数中的某些东西可能会失败。因此,我的建议不仅是尝试找出问题的根源,而且,只包装可能失败的内容
因此,让我们假设您的connect()
作为dict
查找,您对此很关心。解决这个问题的一个方法是捕获异常。所以,我会这样安排
a.py:
def connect():
# bla bla bla...
try:
foo = some_dict["blah"]
except KeyError:
pass
# bla bla bla...
请注意,此异常处理仅用于示例目的。具体实施取决于您
顺便说一句,如果我没有“嵌套”尝试,会发生什么
您的具体示例将转换为:
如果异常是ValueError
,则在a.py
中捕获异常,如果不是,则仍在b.py
中捕获它作为一般异常
在我看来,这似乎是您试图处理可能发生的任何异常的结果。正如我上面所说的,你应该采取的方法是,只尝试处理可能失败的事情
此代码在其当前状态下将处理可能发生的任何异常。但从逻辑上讲,很可能有很多代码不应该失败。因此,如果一个完全陌生的人阅读了你的代码,他可能会认为在你的
connect
方法中发生了很多奇怪的事情,而实际上你只是在处理你不应该处理的错误 这完全取决于您对try/except块的期望。
如果connect()
运行的某些代码可能会抛出一个KeyError,比如说,因为它假设已填充字典,那么您可能希望捕获该代码并填充字典:
try:
my_value = my_dict['my_key']
except KeyError:
my_dict = populate_my_dict()
connect()
但是,如果您不希望connect
出现错误,但又不希望b.py
在发生任何事情时崩溃,则可能需要执行以下操作
from a import connect
try:
connect()
except StandardError as err:
print("{filename} ran into the following error: {err}".format(filename=__name__, err=err)
重要的是不要执行简单的try/except块,即不要按原样使用except:
。捕获您期望的特定错误,因为否则您将导致代码崩溃并在引擎盖下运行,从而几乎无法进行调试
顺便说一句,如果我没有“嵌套”尝试,会发生什么
如果
connect()
没有抛出值错误,connect()
将崩溃,之后异常将通过管道传输到b.py
。由于b.py
预期出现任何异常(这类似于裸except块,请改用StandardError或UserWarning),将捕获异常,并触发b.py
的except块体。这是我的建议,是的。