【问题标题】:Catch any error in Python [duplicate]捕获 Python 中的任何错误 [重复]
【发布时间】:2011-10-12 15:46:12
【问题描述】:

是否可以在 Python 中捕获 any 错误?我不关心具体的例外情况是什么,因为它们都有相同的回退。

【问题讨论】:

  • 就像那条在乡间小路上追车的狗:当你抓住它时你会怎么做?一些错误(即 MemoryError)意味着 Python 已经崩溃了。
  • @S.Lott 好吧,如果可能的话,我在一些长时间运行的应用程序中使用它来通知我问题。当然有些错误会很严重,没有任何帮助(因为你不能再做任何事情了),但总比没有好。
  • @Voo:“聊胜于无”?我发现这通常比注意到更糟糕。例如,内存不足意味着事情已经无法正常运行。恢复 Python 计算的某些有效“先前状态”似乎是不可能的。
  • 这能回答你的问题吗? About catching ANY exception

标签: python exception exception-handling try-catch fallback


【解决方案1】:

单独使用except 将捕获任何没有段错误的异常。

try:
    something()
except:
    fallback()

您可能需要单独处理 KeyboardInterrupt 以防您需要使用它来退出脚本:

try:
    something()
except KeyboardInterrupt:
    return
except:
    fallback()

有一个很好的基本异常列表,您可以捕获here。我也很喜欢 traceback 用于从异常中检索调用堆栈的模块。在异常处理程序中尝试traceback.format_exc()traceback.print_exc()

【讨论】:

  • 在大多数情况下,您还应该让NameError(可能还有一些其他人,例如AttributeError)传播,因为它们表明您的代码中存在错误。
  • 捕捉except Exception 通常是更好的做法 - KeyboardInterrupt 和 SystemExit 不会从 Exception 继承,因此您仍然可以“突围”。当然,这取决于你的目的。
  • fallback() 来自哪里?我收到“NameError: name 'fallback' is not defined”!
  • 但我想指向 e 的异常,无论类型如何。
  • @Apostolos 回答者。 ;)
【解决方案2】:
try:
    # do something
except Exception, e:
    # handle it

对于 Python 3.x:

try:
    # do something
except Exception as e:
    # handle it

【讨论】:

  • 这与接受的答案有何不同?我看到代码有所不同,但您介意添加一些 cmets/细节吗?
  • 异常不会捕获所有的错误,但是除了会。
  • 我不认为这是正确的语法
  • @CharlieParker 不同的是,在这种情况下,您可以访问 Exception 对象。
  • @sergzach 所以第一个选项会捕获所有错误并通过e 给我一个指向异常对象的指针?`
【解决方案3】:

您可能还想看看sys.excepthook

当异常被引发但未被捕获时,解释器调用 sys.excepthook 带三个参数,异常类,异常 实例和回溯对象。在交互式会话中,这 发生在控制权返回到提示符之前;在 Python 中 程序这发生在程序退出之前。的处理 可以通过分配另一个来自定义此类顶级异常 sys.excepthook 的三参数函数。

例子:

def except_hook(type, value, tback):
    # manage unhandled exception here
    sys.__excepthook__(type, value, tback) # then call the default handler

sys.excepthook = except_hook

【讨论】:

  • 但我想指向 e 的异常,无论类型如何。
【解决方案4】:

引用赏金文字:

我希望能够捕获任何异常,甚至是奇怪的异常,例如 键盘中断甚至系统退出(例如,如果我的 HPC 管理器抛出 一个错误)并获得异常对象 e 的句柄,无论它是什么 可能。我想处理 e 并自定义打印它,甚至发送它 电子邮件

exception hierarchy,需要抓到BaseException

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception

这将捕获KeyboardInterruptSystemExitGeneratorExit,它们都继承自BaseException,但不继承自Exception,例如

try:
    raise SystemExit
except BaseException as e:
    print(e.with_traceback)

【讨论】:

    【解决方案5】:

    不提你想自己处理的异常类型就行了。

    试试这个:

        try:
           #code in which you expect an exception 
        except:
           #prints the exception occured
    

    如果您想知道发生的异常类型:

        try:
           #code in which you expect an exception 
        except Exception as e:
           print(e)
           #for any exception to be catched
    

    详细解释请看这里 https://www.tutorialspoint.com/python/python_exceptions.htm

    【讨论】:

      【解决方案6】:

      以下仅对我有用(在 PY2 和 PY3 中):

      try:
        # (Anything that produces any kind of error)
      except:
        ertype = sys.exc_info()[0]  # E.g. <class 'PermissionError'>
        description = sys.exc_info()[1]   # E.g. [Errno 13] Permission denied: ...
        # (Handle as needed ) 
      

      【讨论】:

      • 但我想指向 e 的异常,无论类型如何。
      • @CharlieParker 你提供了赏金但从未颁发过,你解决了你的问题吗?
      【解决方案7】:
      # in python 3
      
      # if you want the error
      try:
          func()
      except Exception as e:
          exceptionFunc(e)
      
      # if you simply want to know an error occurs
      try:
          func()
      except:
          exceptionFunc()
      
      # if you don't even wanna do anything
      try:
          func()
      except:
          pass
      

      【讨论】:

        【解决方案8】:

        Python 中的内置异常

        内置异常类分为基本错误类具体错误类,它们定义了您更容易看到的异常到时间。

        有关内置异常的更详细文档可以在 [https://docs.python.org/3/library/exceptions.html] 中找到

        自定义例外

        它用于适合您的特定应用情况。例如,您可以将自己的异常创建为 RecipeNotValidError,因为该食谱在您的课程中无效,无法用于开发烹饪应用程序。

        实施

        
        class RecipeNotValidError(Exception):    
            def __init__(self):       
                self.message = "Your recipe is not valid"        
                try:            
                    raise RecipeNotValidError
                except RecipeNotValidError as e:            
                    print(e.message)
        
        

        这些是标准库中未定义的自定义异常。您可以按照以下步骤创建自定义类:

        1. 继承 Exception 类。
        2. 创建一个您选择的新异常类。
        3. 编写代码并使用 try...except 流来捕获和处理您的自定义异常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-31
          • 2014-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多