捕获Python中的所有异常

Mat*_*ner 23 python multithreading exception-handling catch-all python-3.x

在Python中,捕获"所有"异常的最佳方法是什么?

except: # do stuff with sys.exc_info()[1]

except BaseException as exc:

except Exception as exc:
Run Code Online (Sandbox Code Playgroud)

catch可能在一个线程中执行.

我的目标是记录普通代码可能抛出的任何异常,而不屏蔽任何特殊的Python异常,例如指示进程终止等的异常.

获取异常的句柄(例如通过上面包含的子句exc)也是可取的.

mou*_*uad 37

  • except Exception:vs except BaseException::

    捕获Exception和之间的区别在于BaseException,根据异常层次结构异常,如SystemExit,KeyboardInterrupt和GeneratorExit在使用时不会被捕获,except Exception因为它们直接从中继承BaseException.

  • except:vs except BaseException::

    这两者之间的区别主要在于python 2(AFAIK),并且只有在使用旧样式类作为异常时才会被引发,在这种情况下,只有表达式的except子句才能捕获异常,例如.

    class NewStyleException(Exception): pass
    
    try:
       raise NewStyleException
    except BaseException:
       print "Caught"
    
    class OldStyleException: pass
    
    try:
       raise OldStyleException
    except BaseException:
       print "BaseException caught when raising OldStyleException"
    except:
       print "Caught"
    
    Run Code Online (Sandbox Code Playgroud)

  • 我将`NewStyleException`继承自`Exception`,正如官方推荐的那样(http://docs.python.org/tutorial/errors.html#user-defined-exceptions). (2认同)

Céd*_*ien 23

如果您需要捕获所有异常并为所有人执行相同的操作,我建议您:

try:
   #stuff
except:
   # do some stuff
Run Code Online (Sandbox Code Playgroud)

如果您不想屏蔽"特殊"python异常,请使用Exception基类

try:
   #stuff
except Exception:
   # do some stuff
Run Code Online (Sandbox Code Playgroud)

对于一些与例外相关的管理,请明确地抓住它

try:
   #stuff
except FirstExceptionBaseClassYouWantToCatch as exc:
   # do some stuff
except SecondExceptionBaseClassYouWantToCatch as exc:
   # do some other stuff based
except (ThirdExceptionBaseClassYouWantToCatch, FourthExceptionBaseClassYouWantToCatch) as exc:
   # do some other stuff based
Run Code Online (Sandbox Code Playgroud)

python文档中的异常层次结构应该是一个有用的读物​​.

  • 感谢您提供异常层次结构的链接。:) (2认同)