gpt4 book ai didi

python - 如何更改引发异常时的行为?

转载 作者:太空宇宙 更新时间:2023-11-04 01:17:31 24 4
gpt4 key购买 nike

我正在为我的操作系统类(class)制作一个模拟操作系统。涵盖的主题之一是中断和错误。我将做一个简单的案例:

def read_instructions():
try:
with open('assembly.txt', 'r') as assembly:
for line in assembly:
status = execute_instruction(line) # this will also raise an error if instruction is invalid
except IOError as e:
raise IOError(1)

我想要的不是像 [err 2] File Not Found] 之类的东西,而是那些默认的 python 行,而是更像这样的东西:

def Exceptions(e):
""" this is meant to be a 'fake' event-vector table """
self.controller[status] = e # all exceptions will do this
def io_exception():
print('failed while trying to find your file')
# some traceback and logging shenanigans here
shutdown_system()

def invalid_assembly():
print('your assembly line did not follow instruction set')
# more traceback
shutdown_system()

def unimplemented():
print("you made an error I didn't catch. You've won this round.")

return {
1: io_exception,
2: invalid_assembly
}.get(e, unimplemented)()

是否可以覆盖引发异常的位置,而不是让它们转到此处?

最佳答案

异常冒泡,直到它们遇到 except 关键字。如果它们在当前执行上下文之外(也就是 untrapped),它们会导致 Python 打印堆栈跟踪和错误中包含的消息(通常会终止发生在其中的线程)。

您当然可以使用自己的类扩展 Exception 或任何其他标准错误类型,并对它们使用 raise,但您不能更改异常系统的工作方式,它是语言规范的一部分。

所以你应该做的是在你的“操作系统”中,捕获所有的异常:

try:
run_task() # Runs an OS task
except Exception as e:
# Do OS exception handling here. This will trap any exception thrown by a task.

然后做任何你想做的事。

您甚至可以定义自己的基本异常:

class OSBaseException(Exception):
def __init__(self, *args, **kwargs):
super(Exception, self).__init__(*args, **kwargs)
# any other init here
# An OS specific method hooks here

您希望扩展所有用户的异常,从而提供您的操作系统的陷阱系统所期望的一些额外的 Hook 。

Curious Course on Coroutines and Concurrency实际上提供了一个很好的例子来说明你正在做什么。

请注意,您将压缩所有堆栈跟踪,这对于使用您的操作系统的“开发人员”来说可能会很烦人。

关于python - 如何更改引发异常时的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23458479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com