我试图在一个线程中捕获异常并在主线程中重新引发它:
import threading
import sys
class FailingThread(threading.Thread):
def run(self):
try:
raise ValueError('x')
except ValueError:
self.exc_info = sys.exc_info()
failingThread = FailingThread()
failingThread.start()
failingThread.join()
print failingThread.exc_info
raise failingThread.exc_info[1]
Run Code Online (Sandbox Code Playgroud)
这基本上起作用并产生以下输出:
(<type 'exceptions.ValueError'>, ValueError('x',), <traceback object at 0x1004cc320>)
Traceback (most recent call last):
File "test.py", line 16, in <module>
raise failingThread.exc_info[1]
Run Code Online (Sandbox Code Playgroud)
但是,异常的来源指向第16行,其中发生了重新加注.原始异常来自第7行.如何修改主线程以使输出显示:
Traceback (most recent call last):
File "test.py", line 7, in <module>
Run Code Online (Sandbox Code Playgroud) 我想知道在python中是否有可能在一个除了块之外引发异常并在稍后的块中捕获它.我相信其他一些语言默认会这样做.
这就是它的样子"
try:
something
except SpecificError as ex:
if str(ex) = "some error I am expecting"
print "close softly"
else:
raise
except Exception as ex:
print "did not close softly"
raise
Run Code Online (Sandbox Code Playgroud)
我希望在else子句中使用raise来触发final语句.
实际上我不打印任何东西,只记录它,我想记录更多的情况,这是我不期望的错误消息.但是,这个额外的日志记录将包含在最终的日志中.
我相信一个解决方案是创建一个函数,如果它没有软关闭,在最后的except和else子句中调用.但这似乎没必要.
这是我需要移植的python2代码:
try:
do_something_with_file(filename)
except:
exc_type, exc_inst, tb = sys.exc_info()
exc_inst.filename = filename
raise exc_type, exc_inst, tb
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,我可以通过检查异常是否具有'filename'属性来获取有问题的输入文件的整个异常.
但是python3的加注已经改变了.这是2to3给我的上述代码:
except Exception as e:
et, ei, tb = sys.exc_info()
e.filename = filename
raise et(e).with_traceback(tb)
Run Code Online (Sandbox Code Playgroud)
这给了我另一个错误,我不认为文件名属性被保留:
in __call__
raise et(e).with_traceback(tb)
TypeError: function takes exactly 5 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
我只想要透明地传递异常和一些信息来跟踪输入文件.我想念python2 raise [exception_type[,exception_instance[,traceback]]]
- 我怎么能在python3中做到这一点?