在做研究解决问题的同时如何在处理程序之后自动重新引发异常 https://stackoverflow.com/q/56084252/216356,开发了一个异常类,具有在处理后自动再次抛出自身的能力(受到ThreadAbortException
在 C# 中)。经过大量的试验和错误,该类已被证明可以在最简单的情况下工作。我担心的是,如果异常处理程序调用函数或者异常处理程序有自己的,可能会产生不必要的开销try
和其中的处理程序块。
到目前为止,该类及其测试是这样的:
#! /usr/bin/env python3
import dis
import inspect
import sys
def main():
try:
raise SpecialError
except SpecialError as error:
print(f'{error!r} was caught!')
# error.reset()
print('You should not see this!')
class SpecialError(BaseException):
DEBUG = False
THROW = {dis.opmap['END_FINALLY'], dis.opmap['POP_EXCEPT']}
def __init__(self, *args):
super().__init__(*args)
self.__stack = []
frame = inspect.currentframe()
while frame:
self.__stack.append((frame, frame.f_trace))
frame.f_trace = self.__trace
frame = frame.f_back
self.__saved = sys.gettrace()
sys.settrace(self.__trace)
def __trace(self, frame, event, arg):
frame.f_trace_lines = False
frame.f_trace_opcodes = True
if event == 'opcode':
op = frame.f_code.co_code[frame.f_lasti]
if self.DEBUG:
print(dis.opname[op])
if op in self.THROW:
raise self
return self.__trace
def reset(self):
sys.settrace(self.__saved)
for frame, trace in self.__stack:
frame.f_trace = trace
if __name__ == '__main__':
main()
是否存在应禁用跟踪的任何事件,是否应将任何操作码记录到堆栈并弹出以检测异常何时应真正再次引发自身(在处理程序块结束后捕获该异常)?
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)