1

SyntaxError はキャッチできない唯一のエラーであることがわかりました。例えば:

if __name__ == "__main__":
    print "main running"  
    try:
        for i in range(3):
    except SyntaxError,e:
        print "error caught"
    finally:
        print "i am here"

まあ、print "main running" が表示されると思いますが、そうならないので、python は実行前にすべての構文をチェックしますか?

4

2 に答える 2

4

Pythonは、最初にコードをバイトコードにコンパイルします。それが失敗した場合、aSyntaxErrorが発生し、コンパイルの失敗を示します。

そのため、構文エラー自体SyntaxErrorあるモジュール内から例外をキャッチすることはできません。Python は必要に応じてファイルをコンパイルするため、インポートしたモジュールの例外をキャッチできます。SyntaxError

次の印刷物Failed to import test

test.py

print,

catchsyntaxerror.py

try:
    import test
except SyntaxError:
    print 'Failed to import test'

次に実行しpython catchsyntaxerror.pyます。

于 2012-12-08T09:04:22.087 に答える
1

SyntaxError無効な構文は、作成者が間違いを犯したと認識している特定の行だけでなく、モジュール全体の有効性を損なうため、実行時に検出することは不可能です。インタプリタは作成者の意図を理解していないため、ソースを読み損ねた後にできることは、エラーを発生させることだけです。

Martin Pieters が答えたように、失敗は、Python がモジュール全体を読み取り、それを実行する前にメモリにコンパイルするコンパイル ステップで発生します。ただし、別のコンパイル手順がなくても、実行時にインライン構文エラーをキャッチするという根本的な問題は残ります。

同じモジュール内で実行時に構文エラーをキャッチするには、エラーのあるコードを周囲のコードから分離する必要があります。execこれは、ステートメントまたはeval関数を使用して実行できます。

>>> try:
...     exec """
... this doesn't work  
... """
... except SyntaxError:
...     print "fail"
... 
fail

インポートされたモジュールの構文エラーをキャッチするには、ステートメントをtry/で囲みます。exceptimport

于 2012-12-08T09:12:38.820 に答える