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

Jam*_*eat 2 python sys python-2.7 try-except

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

但是,此函数包含多个sys.exit()调用.

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

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

def myFunction():
   sys.exit("Yolo")
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 10

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

try:
    myFunction()
except Exception:
   print "Error running myFunction()"
Run Code Online (Sandbox Code Playgroud)

Exception类是基类异常,但不是 SystemExit.加上GeneratorExitKeyboardInterrupt,SystemExit是的子类BaseException来代替:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
     +-- Everything else
Run Code Online (Sandbox Code Playgroud)

Exception另一方面,它也是一个子类BaseException,其余的Python异常类都是从它而不是BaseException直接派生的.捕获Exception将捕获所有派生的异常,但不会捕获兄弟类.

请参阅异常层次结构.

因此,您应该很少使用一揽子except:声明.送花儿给人尽量限制的,除了处理程序,以特定的异常,而不是,或至多Exception.


Ran*_*PhD 5

虽然了解您要捕获的异常是有效的,但也有一些全面的选择。下面使用sys库来捕获所有异常并traceback来处理异常消息。第一个代码块有点多余,但演示了如何将该异常分配给变量并进行解释。请记住,异常会作为包含错误类、消息和回溯的元组返回。如下:

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]))
Run Code Online (Sandbox Code Playgroud)

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

try:
    myFunction() except:
    print('Error: ', sys.exc_info()[0])
Run Code Online (Sandbox Code Playgroud)

快乐的错误捕捉!