【问题标题】:Catching all exceptions in Python在 Python 中捕获所有异常
【发布时间】:2023-03-03 15:10:01
【问题描述】:

在 Python 中,捕捉“所有”异常的最佳方法是什么?

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

except BaseException as exc:

except Exception as exc:

catch 可能正在线程中执行。

我的目标是记录普通代码可能引发的任何异常,而不掩盖任何特殊的 Python 异常,例如那些指示进程终止等的异常。

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

【问题讨论】:

    标签: python multithreading exception-handling python-3.x catch-all


    【解决方案1】:
    • except Exception:except BaseException::

      捕捉ExceptionBaseException的区别在于,根据exception hierarchy这样的异常,使用except Exception时不会捕捉到except Exception,因为它们直接继承自BaseException

    • except: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"
      

    【讨论】:

    【解决方案2】:

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

    try:
       #stuff
    except:
       # do some stuff
    

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

    try:
       #stuff
    except Exception:
       # do some stuff
    

    对于一些异常相关的管理,明确捕获:

    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
    

    python 文档中的exception hierarchy 应该是有用的阅读材料。

    【讨论】:

    • 感谢异常层次结构的链接。 :)
    • 如果未定义 except 类,如何获取捕获的异常实例?
    • @Mvorisek 使用except Exception as exc,Eception 是所有异常的基类,所以它会捕获一切。
    【解决方案3】:

    为了避免掩盖基本异常,您需要“重新引发”任何不是您明确要处理的异常,例如(改编自8. Errors and Exceptions):

    导入系统

    尝试: # 做一些可能引发异常的事情: 除了 IOError 为 (errno, strerror): print "I/O 错误({0}): {1}".format(errno, strerror) 除了ValueError: print "无法将数据转换为整数。" 除了: # 可能会记录异常(例如在调试模式下) # 重新引发异常: 增加

    【讨论】:

    • 最后的except: raise 什么都不做:完全可以跳过;非 IOError 和非 ValueError 异常根本不会被捕获并由解释器自动引发。
    • @EOL 你是对的。我已经编辑了我的答案,以说明为什么最后的 except: 可能有用。
    猜你喜欢
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2018-11-01
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多