2024-05-14 13:36:13 发布
网友
如何处理除了一个异常以外的所有异常?
try: something except <any Exception except for a NoChildException>: # handling
像这样,除了没有破坏原始的回溯:
try: something except NoChildException: raise NoChildException except Exception: # handling
我发现了一个上下文,在这个上下文中,捕获所有错误(只有一个错误)并不是坏事,即单元测试。
如果我有方法:
def my_method(): try: something() except IOError, e: handle_it()
然后,它可能有一个单元测试,看起来像:
def test_my_method(): try: my_module.my_method() except IOError, e: print "shouldn't see this error message" assert False except Exception, e: print "some other error message" assert False assert True
因为你现在已经检测到我的方法抛出了一个意外的异常。
我提出这个建议是对公认答案的改进。
try: dosomestuff() except MySpecialException: ttype, value, traceback = sys.exc_info() raise ttype, value, traceback except Exception as e: mse = convert_to_myspecialexception_with_local_context(e, context) raise mse
这种方法通过在捕获MySpecialException时维护原始stacktrace改进了已接受的答案,因此当顶级异常处理程序记录异常时,您将得到一个指向原始异常抛出位置的回溯。
答案是做一个简单的raise:
raise
try: ... except NoChildException: # optionally, do some stuff here and then ... raise except Exception: # handling
这将重新引发最后一个抛出的异常,原始堆栈跟踪保持完整(即使已处理)。
我发现了一个上下文,在这个上下文中,捕获所有错误(只有一个错误)并不是坏事,即单元测试。
如果我有方法:
然后,它可能有一个单元测试,看起来像:
因为你现在已经检测到我的方法抛出了一个意外的异常。
我提出这个建议是对公认答案的改进。
这种方法通过在捕获MySpecialException时维护原始stacktrace改进了已接受的答案,因此当顶级异常处理程序记录异常时,您将得到一个指向原始异常抛出位置的回溯。
答案是做一个简单的
raise
:这将重新引发最后一个抛出的异常,原始堆栈跟踪保持完整(即使已处理)。
相关问题 更多 >
编程相关推荐