相关疑难解决方法(0)

重新引发Python异常并保留堆栈跟踪

我试图在一个线程中捕获异常并在主线程中重新引发它:

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 exception stack-trace

53
推荐指数
1
解决办法
1万
查看次数

Python重新加载/重新获取异常

我想知道在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子句中调用.但这似乎没必要.

python exception raise

13
推荐指数
2
解决办法
1万
查看次数

python3使用自定义属性重新引发异常?

这是我需要移植的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中做到这一点?

python python-3.x

7
推荐指数
2
解决办法
5105
查看次数

标签 统计

python ×3

exception ×2

python-3.x ×1

raise ×1

stack-trace ×1