尝试和除了捕获所有错误,sys.exit()除外

时间:2014-10-05 02:56:34

标签: python python-2.7 sys try-except

我创建了一个函数,但可能会弹出错误。这就是为什么我想使用异常将所有错误概括为同一个消息。

但是,此功能包含多个sys.exit()来电。

因此,如果引发错误,我希望我的代码跳转到except处理程序,除非它是由sys.exit()引起的。我该怎么做?

try:
   myFunction()
except:
   print "Error running myFunction()"

def myFunction():
   sys.exit("Yolo")

2 个答案:

答案 0 :(得分:8)

你不应该使用毯子except,而是抓住Exception

try:
    myFunction()
except Exception:
   print "Error running myFunction()"

Exception类是大多数例外的基类,但不是 SystemExit。与GeneratorExitKeyboardInterrupt一起,SystemExitBaseException的子类:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
     +-- Everything else
另一方面,

Exception也是BaseException的子类,其余的Python异常类是从它而不是BaseException直接派生的。捕获Exception将捕获所有派生的异常,但不会捕获兄弟类。

请参阅Exception Hierarchy

因此,您应该很少使用一揽子except:语句。总是尝试将except处理程序限制为特定的例外,或者最多 catch Exception

答案 1 :(得分:0)

虽然可以有效地知道要尝试捕获的异常,但还是有一些选择。以下内容使用sys库捕获所有异常,并进行追溯以处理异常消息。第一部分代码有点多余,但是演示了如何将异常分配给变量并进行解释。请记住,异常作为具有错误类,消息和回溯的元组返回。如下:

import sys
import traceback

try:
    myfunction()
except Exception as e:
    e = sys.exc_info()
    print('Error Return Type: ', type(e))
    print('Error Class: ', e[0])
    print('Error Message: ', e[1])
    print('Error Traceback: ', traceback.format_tb(e[2]))

通常,您只是在寻找错误类,这可以非常简洁地完成。 (注意毯子除外。)

try:
    myFunction() except:
    print('Error: ', sys.exc_info()[0])

发现错误很开心!