2016-08-21 17 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はあなたが失敗を捕まえるのを助けます。

言語にはpcallというメソッドがあります。 (保護された呼び出し) エラーで呼び出すと、呼び出しはエラー状態を返し、エラーメッセージは2番目の戻り値とみなされます。

関連する問題