簡體   English   中英

處理python中的遞歸錯誤回溯

[英]Handling recursive error tracebacks in python

我正在努力在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塊......有什么方法可以解決這個問題嗎?

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

把它放在執行開始時。

try語句基本上是一個longjump。 您希望執行一些長任務,這些任務可能會在內部調用中的代碼中的任何位置失敗。 longjump幫助你捕獲失敗。

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

如果您確實想這樣做,請嘗試在基本異常類型和新的異常類型之間創建映射:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM