2009-04-29 6 views
5

Pythonインタプリタは、例外のコードがtry/exceptブロック内にあっても常に例外を発生させるような言語(またはインタープリタ)機能がありますか?Python - try/exceptブロックに関係なく例外を発生させることは可能ですか?

私はPythonで書かれたより大きい古いコードベースを継承しました。その目的は、私たちも開発したカスタム設計されたハードウェアと通信することです。 多くの通信エラーやタイムアウトが/マスクされているため、次のコード(簡体字)のパターンを逃した:私はね、「ただ最初から全部を書き換える」の典型的なシナリオを避けるために

try: 
    serialport.write(MSG) 
except: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not() 
    #or just: 
    #pass 

現在、すべての例外エラー/タイムアウトを修正しようとしています。私はすべての例外処理コードを手作業で無効にすることでこれをやっています。

+1

私は決して使ったことがないので、私はPythonと話すことができません(実際の答えの代わりにコメントとして答えています)が、ほとんどのデバッガには "すべての例外を壊す"というオプションがあります。これは「ファーストチャンスの例外」と呼ばれることもあります。それはあなたのコードが変更されないままにすることができますが、すべての "スロー"をブレークポイントのように扱います。デバッガにその機能があるかどうかを確認してください。 – rmeador

答えて

11

「すべての例外」except:ブロックが著しく悪いことだと簡単に発見し、取り扱いを除いて賢明に置き換える必要があります。

この場合grepはあなたの友人です。よいIDEは、これらの不愉快な雑用を管理しやすくするのに役立ちます。

しかし、Pythonでは「書かれたコードを無視する」オプションはありません。

+1

+1 "書かれたコードを無視する:" –

+1

pyparsingはコード変換を行うのに便利なツールです。 –

-2

複数の例外ハンドラを使用して複数の例外を処理できます。

try: 
    serialport.write(MSG) 
except Handler1: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not() 
    #or just: 
    #pass 
except Handler2: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not2() 
    #or just: 
    #pass 
3

いいえ、実際はありません。最良の方法は、コードを次のように変更することです。

try: 
    serialport.write(MSG) 
except: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not() 
    raise 

これにより、正確な例外が再生成されます。あなたが理解しなければならない主なことは、すべての例外をシステムから出す方法があれば、forループ(イテレータはStopIteration例外を発生させます)を使うことができないことです。

関連する問題