我正在努力在Python中实现一个小编程语言,而语言的执行基本上包括对名为execute
的函数的递归调用。我已经实现了自己的错误处理,但为了让错误处理工作,我需要捕获一些异常并将它们作为我自己的类型抛出,导致代码看起来像这样:
def execute(...):
try:
try:
# do stuff
except IndexError:
raise MyIndexError()
except MyErrorBase as e:
raise MyErrorBase(e, newTracebackLevel) # add traceback level for this depth
我真的很讨厌嵌套的try
块...有什么方法可以解决这个问题吗?
答案 0 :(得分:0)
您需要在需要时设置try语句。
只在开始执行时才把它。
尝试语句基本上是一个longjump。您希望执行一些长任务,这些任务可能会在内部调用中的代码中的任何位置失败。 longjump帮助你捕捉失败。在lua语言中,有一种叫做pcall的方法。 (受保护的电话) 每当它在错误时调用,该调用将返回错误状态,并将错误消息作为第二个返回值。
答案 1 :(得分:0)
如果确实想要这样做,请尝试在基本异常类型和新的异常类型之间创建映射:
exceptionMap = {
IndexError: MyIndexError,
# ...
}
def execute(...):
try:
# do stuff
except tuple(exceptionMap) as e:
raise exceptionMap[type(e)](e, newTracebackLevel)
示例:
In [33]: exceptionMap = {IndexError: RuntimeError}
In [34]: a = []
In [35]: try:
...: a[1]
...: except tuple(exceptionMap) as e:
...: raise exceptionMap[type(e)](str(e))
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-35-bc6fdfc44fbe> in <module>()
2 a[1]
3 except tuple(exceptionMap) as e:
----> 4 raise exceptionMap[type(e)](str(e))
5
6
RuntimeError: list index out of range