[英]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.