「eval」コードによって発生した構文エラーをキャッチ
「eval」関数を使用した Python コードの評価により、開発者は次の時点でコードを動的に実行できます。ランタイム。ただし、興味深い疑問が生じます。なぜ 'eval' は、評価されたコード内で発生する SyntaxError (または IndentationError や TabError などの他のパーサー関連のエラー) をキャプチャできるのに、元のソース コード自体が原因である場合は同じエラーがキャプチャされないのですか?
2 フェーズ コンパイル プロセス
この動作を理解する鍵は、Python の 2 フェーズ コンパイル プロセスにあります。コードが実行されると、次の 2 つのフェーズが実行されます:
コンパイラによって発生した構文エラー
の場合最初のコード スニペットでは、コンパイル フェーズ中に SyntaxError が発生します。 Try/Except ブロックが設定されるまでに、エラーはすでに発生しています。したがって、例外は try/excel によってキャッチできません。
SyntaxErrors Raraised by 'eval'd Code
対照的に、'eval' を使用する場合、コードはは 2 回コンパイルされます。最初にメイン コードがコンパイルされ、実行中に「eval」内で提供されたコードが再度コンパイルされます。この 2 番目のコンパイル フェーズ (try/Except ブロックの確立後) で SyntaxError が発生した場合は、try/Except によってキャッチできます。
元の SyntaxErrors のキャッチ
残念ながら、元のコードの最初のコンパイル中に発生する SyntaxError を直接捕捉する方法はありません。ただし、さまざまな手法を使用して 2 番目のコンパイル フェーズをトリガーし、エラー処理を可能にすることができます。これらの方法には、(例で示されているように) 'eval' の使用、'compile' 関数の利用、または 'import' や 'exec' などの動的メカニズムの利用が含まれます。
2 フェーズのコンパイル プロセスと「eval」の意味により、開発者は動的に実行されるコードで発生する可能性のある SyntaxError を効果的に処理できます。
以上が「eval」は評価されたコードでは構文エラーを検出できるのに、元のコードでは検出できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。