- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
sys.exc_info() 的行为在 python docs 中有描述。和 SO和 SO作为:
那么为什么这个 nosetest 会失败呢?
def test_lang_stack(self):
try:
self.assertEquals((None,None,None), sys.exc_info()) # no exception
a = 5 / 0
except:
self.assertNotEquals((None,None,None), sys.exc_info()) # got exception
else:
self.fail('should not get here')
#finally:
# self.assertEquals((None,None,None), sys.exc_info()) # already handled, right?
self.assertEquals((None,None,None), sys.exc_info()) # already handled, right?
它在最后一行失败了。如果您取消注释 finally block ,它将在那里失败。
我确实看到,如果我将所有这些放在一个方法中并从另一个方法调用,那么调用方法就不会看到异常。 exc_info 值似乎仍设置为抛出异常的方法的末尾,即使在处理异常之后也是如此。
我在 OSX 上使用 python2.7。
最佳答案
在回答你的问题之前,我必须解释一下 sys.exc_info() 决定了你程序中最新/最近的异常:-
Your program is basically a series of function calls, with caller function calling called. Thus a call stack/execution stack is formed, where an entry is pushed for each function, being called. This entry is known as stack frame in python. Thus, when in your program, sys.exc_info() is invoked, it uses the following sequence to determining latest exception. It begins from the current stack frame, which is the function from where you are invoking sys.exc_info(). If the current stack frame is not handling/had not handled an exception, the information is taken from the calling stack frame, or its caller, and so on until a stack frame is found that is handling/had handled an exception . Here, “handling an exception” is defined as “executing or having executed an except clause.” For any stack frame, only information about the most recently handled exception is accessible.
现在,开始你的代码,
def test_lang_stack(self):
try:
self.assertEquals((None,None,None), sys.exc_info()) # no exception
a = 5 / 0
except:
self.assertNotEquals((None,None,None), sys.exc_info()) # got exception
else:
self.fail('should not get here')
#finally:
# self.assertEquals((None,None,None), sys.exc_info()) # already handled, right?
self.assertEquals((None,None,None), sys.exc_info()) # already handled, right?
按照上面解释的过程,sys.exc_info() 总是会发现最近在您的函数中处理的异常。因此,除非您显式调用 sys.exec_clear()
,否则它永远不会是 Nones 的元组。
希望对你有帮助。
关于python - sys.exc_info() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16974489/
我创建了一个 django (1.6.1) 项目并使用了 mongodb。当我运行 python manage.py runserver 0.0.0.0:8000 启动服务器时,出现以下错误 Fi
我正在寻找一种方法来设置 logging.info、logging.warning、logging.error 等 默认情况下,exc_info=True。重构项目以包含此参数在这一点上是不可行的,因
在实际调试程序的过程中,有时只获得异常的类型是远远不够的,还需要借助更详细的异常信息才能解决问题。 捕获异常时,有 2 种方式可获得更多的异常信息,分别是: 使用 sys 模块中的 exc
我想了解以下之间的区别: try: raise Exception("wat") except Exception: extype, exc, tb = sys.exc_info()
在 Python 中,我有捕获异常的代码,如下所示: try: except: exc_info = sys.exc_info() 我遇到的问题是回溯对象 (exc_info[2])
sys.exc_info() 的行为在 python docs 中有描述。和 SO和 SO作为: 在 except block 或由 except block 调用的方法中,描述异常的三元组 在其他地
我为它定义根记录器和处理程序: _root = logging.getLogger() _sh = logging.StreamHandler() _fh = logging.FileHandler(
我正在尝试从异常对象 err 中获取更多信息,超出其错误消息。在我的代码中,我有时会在某些子函数深处捕获异常。回到顶层,我想打印有关异常发生位置等的信息。 我见过类似的问题,其中答案涉及使用 sys.
我知道 sys.exc_info文档说在处理回溯对象时要小心,但我仍然不确定某些情况下的安全性或不安全性。此外,文档说“警告:不要这样做!”,紧接着是“注意:实际上,没问题”,这让我更加困惑。 在任何
我在不同的代码库中看到过,只是在 PyMOTW 上阅读(请参阅第一个注释 here)。 解释说,如果将回溯分配给 sys.exc_info()[2] 中的变量,将创建一个循环,但这是为什么呢? 这个问
在实际调试程序的过程中,有时只获得异常的类型是远远不够的,还需要借助更详细的异常信息才能解决问题。 捕获异常时,有 2 种方式可获得更多的异常信息,分别是: 使用 sys 模块中的 exc_info
我应该选择 sys.exc_info()在 sys.last_value和 friend (sys.last_type,sys.last_traceback)? 最佳答案 查看sys.last_val
我想将错误名称和回溯详细信息保存到变量中。这是我的尝试。 import sys try: try: print x except Exception, ex:
我在 Django 中使用以下格式化程序来记录 django.request 模块中的警告和错误: 'format': '%(levelname)s: %(message)s\n %(exc_info
traceback.format_exception_only有参数 (etype, value)。如果我有一个要格式化的异常 e,在什么情况下我不想调用 format_exception_only(
我有一个捕获所有异常的函数,我希望能够在该函数中将回溯作为字符串获取。 到目前为止这还行不通: def handle_errors(error_type, error_message, error_t
我是一名优秀的程序员,十分优秀!