2016-08-21 122 views
1

我正在爲它的地獄在Python中實現一個小編程語言,並且該語言的執行基本上是對函數execute的遞歸調用。我實現了我自己的錯誤處理,但爲了有一個錯誤處理的工作,我需要捕捉一些例外,並把他們作爲我自己的類型,導致代碼看起來是這樣的:在Python中處理遞歸錯誤回溯

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

如果你真的要做到這一點,嘗試建立基本異常類型和新的異常類型之間的映射:

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 
+0

謝謝!我會試試 – tripl3dogdare

+0

完美工作,謝謝!我的代碼現在感覺更清潔^ - ^ – tripl3dogdare

0

您需要在需要時設置try語句。

僅在開始執行時纔會使用。

try語句基本上是longjump。你想做一些可能在內部調用的代碼中的任何地方失敗的長期任務。 longjump幫助你捕捉失敗。

在lua語言中有一種叫做pcall的方法。 (受保護的調用) 每當調用錯誤時調用都會返回錯誤狀態,並將錯誤消息作爲第二個返回值。