【问题标题】:Is it possible in python to track exception raised even it has been caught?是否有可能在 python 中跟踪引发的异常,即使它已被捕获?
【发布时间】:2014-05-05 01:37:10
【问题描述】:

我有一个讨厌的错误,如果不阅读 django 中的整个模型表单逻辑,我根本无法解决:

django custom model field in admin form gives invalid choice error

基本上发生的事情是在 django 模型表单流程代码中的某个地方引发了 ValidationError,然后它在表单流程中被捕获并显示错误消息。

是否有可能跟踪已引发的特定类型的异常,即使它已在程序内部处理?

例如:

一个大型代码库中的文件,在这个文件的某个地方引发了一个异常并且也被捕获,我不知道这个文件在哪里以及哪一行......

1 def process_form():
2  ...logic...
3  raise ValudationError()
4  ...logic...
5  except ValudationError:
6    ...handle...

一些向我展示的工具: 第 3 行中引发的 ValudationError

【问题讨论】:

    标签: python django exception-handling


    【解决方案1】:

    我想我已经找到了一种方法,至少它是一种解决方法,就是转到 ValidationError 的定义并在 __init__ 方法中打印堆栈跟踪:

    class ValidationError(Exception):
        """An error while validating data."""
        def __init__(self, message, code=None, params=None):
            import traceback
            print traceback.print_exc()
    

    【讨论】:

    • 正在创建的异常对象并不一定意味着它也会被引发。它也可能已经创建并参与了以后的决策过程。这不会经常发生,但有时会发生。
    【解决方案2】:

    是的,可以这样简单地完成

     def process_form():
      ...logic...
      raise ValudationError()
      ...logic...
      except ValudationError as e:
          print e        ### 'e' will be an object of Exception raised
          import traceback
          print traceback.print_exc()
      ...handle...
    

    对于像这样的多重例外

    except (ValudationError, AttributeError) as e:
    

    有关更多信息,您可以阅读此内容https://docs.python.org/2/tutorial/errors.html

    【讨论】:

    • 您好,感谢您的尝试,但我的问题是我不知道它在哪里引发并被抓住。
    • 你的回答假设我知道在哪里放置print traceback.print_exc(),但如果我知道该行的确切位置,我的帖子无效。
    • 据我了解您的问题,您是否有一个带有多个异常处理程序的大型代码库.. 对吗?但是您不确定异常实际上是在哪里处理的。如果您在代码库中使用正确的日志记录,您的问题就可以解决,即每个异常处理程序只提供一个有意义的日志消息,这样当您看到服务器日志时,您可以识别正在处理异常的点。此外,您可以尝试一些工具,例如Sentry 有助于跟踪异常
    猜你喜欢
    • 2011-01-27
    • 1970-01-01
    • 2014-10-23
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多