Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 尝试捕获除sys.exit()之外的所有错误_Python_Python 2.7_Sys_Try Except - Fatal编程技术网

Python 尝试捕获除sys.exit()之外的所有错误

Python 尝试捕获除sys.exit()之外的所有错误,python,python-2.7,sys,try-except,Python,Python 2.7,Sys,Try Except,我已经创建了一个函数,但可能会出现错误。这就是为什么我想使用异常将所有错误概括为同一条消息 但是,此函数包含多个sys.exit()调用 因此,如果引发错误,我希望代码跳转到处理程序中,除非它是由sys.exit()引起的。我该怎么做 try: myFunction() except: print "Error running myFunction()" def myFunction(): sys.exit("Yolo") 您不应使用覆盖的异常,而应捕获异常: try:

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

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

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

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

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

您不应使用覆盖的
异常
,而应捕获
异常

try:
    myFunction()
except Exception:
   print "Error running myFunction()"
Exception
类是大多数异常的基类,但不是
SystemExit
。与
GeneratorExit
KeyboardInterrupt
一起,
SystemExit
BaseException
的子类:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
     +-- Everything else
另一方面,
Exception
也是
BaseException
的一个子类,其余的Python异常类都是从它派生的,而不是直接从
BaseException
派生的。捕获
Exception
将捕获所有派生的异常,但不会捕获同级类


因此,除了:
语句之外,您应该很少使用毯子
。始终尝试将except处理程序限制为特定的异常,或者至多捕获
异常

虽然知道您试图捕获的异常是有效的,但有一些全面的选项。下面使用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]))
通常,您只是在寻找error类,这可以非常简洁地完成。(注意毛毯除外。)


快乐的错误捕捉

另外,您应该更改函数,使其不调用sys.exit。这使得它很难以其他方式使用。例如,它很难测试。要加倍强调最后一行:您应该很少捕捉到异常。您应该几乎总是知道代码可能抛出的特定类型的异常,并且只捕获这些异常。
try:
    myFunction() except:
    print('Error: ', sys.exc_info()[0])