在 python 中放置异常处理的位置
Where to put exception handling in python
在 Python 中使用 try/except 块时,是否建议将其委托给任何可能引发异常的方法,或在父函数中捕获它,或两者兼而有之?
例如,以下哪项是首选?
def my_function():
s = something.that.might.go_wrong()
return s
def main():
try:
s = my_function()
except Exception:
print "Error"
或
def my_function():
try:
s = something.that.might.go_wrong()
return s
except Exception:
print "Error"
def main():
s = my_function()
PEP 8 似乎对此事保持沉默,我似乎到处都能找到这两种情况的例子。
这实际上取决于相关函数的语义。一般来说,如果您正在编写一个库,您的库可能应该处理在库内部引发的异常(可选择将它们重新引发为新的特定于库的异常)。
不过,在单个函数级别,您要考虑的主要事情是 context/scope 您希望在什么情况下处理异常 - 如果在异常情况下您可以做一些合理的不同事情内部函数,在内部函数中处理它可能会有用;否则,在外部函数中处理它可能更有意义。
对于写入输出的特定情况,仅在最高级别执行此操作通常很有用,并且内部函数仅 (a) return 值或 (b) 引发异常。这使得代码更易于测试,因为您不必担心测试副作用输出。
我一直用第二个。从逻辑上讲,似乎一个函数的问题应该只在那个函数中处理。这将为用户提供一个干净且无障碍的界面,因此您以后可以将您的代码放入库中。
在某些情况下,您可能希望在函数外部使用异常。例如,如果您想在出现问题时打印特定消息,那么您应该使用函数外的异常。
但是,如果您想让用户能够决定他自己的异常消息,您可以将异常语句作为参数提供给函数。所以我想第二个例子(函数内的异常)将是通用的,因此应该是首选。
如果您遵循 "one function should handle one task" 的规则,那么您不应该在该函数中处理异常,让它在意外输入时大声失败。调用此类函数的父函数可以处理以提供更好的用户体验。
我们可以参考 python 内置函数来获得 pythonic 方式
在 Python 中使用 try/except 块时,是否建议将其委托给任何可能引发异常的方法,或在父函数中捕获它,或两者兼而有之?
例如,以下哪项是首选?
def my_function():
s = something.that.might.go_wrong()
return s
def main():
try:
s = my_function()
except Exception:
print "Error"
或
def my_function():
try:
s = something.that.might.go_wrong()
return s
except Exception:
print "Error"
def main():
s = my_function()
PEP 8 似乎对此事保持沉默,我似乎到处都能找到这两种情况的例子。
这实际上取决于相关函数的语义。一般来说,如果您正在编写一个库,您的库可能应该处理在库内部引发的异常(可选择将它们重新引发为新的特定于库的异常)。
不过,在单个函数级别,您要考虑的主要事情是 context/scope 您希望在什么情况下处理异常 - 如果在异常情况下您可以做一些合理的不同事情内部函数,在内部函数中处理它可能会有用;否则,在外部函数中处理它可能更有意义。
对于写入输出的特定情况,仅在最高级别执行此操作通常很有用,并且内部函数仅 (a) return 值或 (b) 引发异常。这使得代码更易于测试,因为您不必担心测试副作用输出。
我一直用第二个。从逻辑上讲,似乎一个函数的问题应该只在那个函数中处理。这将为用户提供一个干净且无障碍的界面,因此您以后可以将您的代码放入库中。
在某些情况下,您可能希望在函数外部使用异常。例如,如果您想在出现问题时打印特定消息,那么您应该使用函数外的异常。
但是,如果您想让用户能够决定他自己的异常消息,您可以将异常语句作为参数提供给函数。所以我想第二个例子(函数内的异常)将是通用的,因此应该是首选。
如果您遵循 "one function should handle one task" 的规则,那么您不应该在该函数中处理异常,让它在意外输入时大声失败。调用此类函数的父函数可以处理以提供更好的用户体验。
我们可以参考 python 内置函数来获得 pythonic 方式