Python 处理异常的更好方法是什么?
如果我在编写代码时对某些东西不确定,我会再次尝试阅读Python的禅宗。这一次,那些台词使我犹豫不决Python 处理异常的更好方法是什么?,python,exception,zen-of-python,Python,Exception,Zen Of Python,如果我在编写代码时对某些东西不确定,我会再次尝试阅读Python的禅宗。这一次,那些台词使我犹豫不决 Errors should never pass silently. Unless explicitly silenced. 在当前代码中,我有一些函数可能如下所示: def add_v_1(a, b): return a + b 对他们的所有要求如下: c = add_v_1(7, []) 这类代码的例外情况将在上层出现并捕获 但应该是这样吗 add_v_1会引发TypeErr
Errors should never pass silently.
Unless explicitly silenced.
在当前代码中,我有一些函数可能如下所示:
def add_v_1(a, b):
return a + b
对他们的所有要求如下:
c = add_v_1(7, [])
这类代码的例外情况将在上层出现并捕获
但应该是这样吗
add_v_1
会引发TypeError
异常,我想从中恢复。
因此,函数的可能调用是:
try:
c = add_v_1(7, [])
except TypeError:
print "Incorrect types!"
c = add_v_2(7, [])
但对于每个调用,我都应该进行异常处理。看起来很重
因此,我可以做到:
def add_v_2(a, b):
try:
return a + b
except TypeError:
print "Incorrect types!"
一个电话是:
try:
c = add_v_1(7, [])
except TypeError:
print "Incorrect types!"
c = add_v_2(7, [])
看起来更干净
似乎所有这些方法都遵循Python的禅宗思想,但哪一种方法更好呢?输入:
def add_v_2(a, b):
try:
return a + b
except Exception as e:
print str(e)
c = add_v_2(7, [])
print (c)
输出:
unsupported operand type(s) for +: 'int' and 'list'
None
参考您的示例,是否应该捕获函数内部的异常是有争议的。这样做将从函数返回
None
,然后检查函数的返回值,并将None
视为错误,从而加重调用代码的负担。它有效地将异常处理替换为错误检查。前者通常更像蟒蛇
您应该询问捕获错误(例如试图添加两种完全不同的数据类型)是否有意义。在这种情况下,这样做似乎是一个编程错误,而不是您在正常执行期间所期望的那样
你能做些什么来处理这样的错误呢?在函数预期输出的域中似乎没有任何有用的值可以返回。。。除None
之外,发出无法生成结果的信号。但是调用代码仍然必须执行某种类型的错误检查。。。所以它也可以只处理一个异常——至少它只需要处理一次
但这个例子是人为的,很难给出全面的建议。在这种特殊情况下,出于上述原因,我允许异常传播到调用代码并在那里处理它。您应该在能够从中恢复时处理异常。如果尝试添加两个类型不兼容的值,则无法从中恢复(没有进一步的上下文) 假设您编写了一个IntegerRapper类,并且您的函数“add_v_2”通常应该尝试连接两个值
def add_v_2(a, b):
try:
return a + b
except TypeError as e:
if isinstance(a, IntegerWrapper):
return str(a) + b
else:
print("I dont know how to handle this type: " + type(a).__name__)
# reraise the error so the caller can handle it
raise
这将尝试从一个属于“错误类型”的中恢复,但前提是您知道如何从中恢复。如果它不知道(a是另一种类型),它将重新引发异常,以便知道如何处理该异常的人看到错误
(当然,该实现包含bug,它并不意味着是一个“好的实现”)@viakondratiuk-在您的代码中,第二个是最好的,如果任何情况下您会再次做同样的事情,无需再次使用try catch,我不能建议捕获异常
,这是非常普遍的。您应该捕获您期望并可以处理的异常,在这种情况下,您可以捕获TypeError
。我认为这取决于您的情况,如果您在函数内部处理异常,您还必须在外部处理它,因为它将不返回任何异常。@hacket对于当前示例,您将如何处理?