处理程序后如何自动重新引发异常

时间:2019-05-10 20:12:16

标签: python python-3.x exception rethrow

在C#中,线程具有一种Abort方法,该方法将在它们可能运行的任何地方引发ThreadAbortException。 Python没有此功能,因此已实现。但是,此实现不会导致在所有异常处理结束时自动重新引发异常。

使用sys.settraceThreadAbortException.__del__进行了一些实验,均未成功。这些似乎在实现可以自动再次引发自身的异常的正确轨道上。不幸的是,一个干净的实现可能还支持将来的线程ResetAbort方法,这对我来说有点困难。

以下是到目前为止编写的实现:

#! /usr/bin/env python3
import ctypes
import threading

PyThreadState_SetAsyncExc = ctypes.pythonapi.PyThreadState_SetAsyncExc
PyThreadState_SetAsyncExc.argtypes = ctypes.c_ulong, ctypes.py_object
PyThreadState_SetAsyncExc.restype = ctypes.c_int


def set_async_exc(thread_id, exception):
    if not isinstance(thread_id, int):
        raise TypeError('thread_id should be of type int')
    if not issubclass(exception, BaseException):
        raise TypeError('exception should be subclass of BaseException')
    return PyThreadState_SetAsyncExc(thread_id, exception)


class ThreadAbortException(SystemExit):
    pass


class CThread(threading.Thread):
    def abort(self):
        set_async_exc(self.ident, ThreadAbortException)

我的期望是ThreadAbortException的一个实例应该能够在被捕获和处理后的某个时间自动再次升起。在处理它的上下文返回给调用者之后或由垃圾收集器收集它时,可能需要引发它。有谁知道如何做到这一点?

0 个答案:

没有答案