Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 处理异常的更好方法是什么?_Python_Exception_Zen Of Python - Fatal编程技术网

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

如果我在编写代码时对某些东西不确定,我会再次尝试阅读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
会引发
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对于当前示例,您将如何处理?