2015-01-12 12 views
8

Pythonプログラムを実行すると、Pythonインタプリタは、ソースに構文エラーがない限り、バイトコード.pycファイルが.pyソースの横に表示されます)を生成します。Pythonの例外(SyntaxErrorを除く)は実行時エラーですか?

.pycコードが実行されているときに、バイトコードコンパイラは他の例外を生成するか、実行時に発生する例外をすべて排除しますか?

+2

また、 'IndentationError'がありますが、それはあなたの質問にはほんの少しだけ追加されるかもしれません(事実上構文エラーです)。 –

+0

Python 2.7の組み込み例外の一覧は、[ここ](https://docs.python.org/2/library/exceptions)です。html#exception-hierarchy)を参照してください。私が忘れてしまった 'TabError'もあります。私は残りの部分がランタイムエラーだと思っていますが、わかりにくいものがあります。私が間違っていれば、もっと多くのPython実装の知識がある人に教えてもらうでしょう。 –

+1

'SyntaxError' _can_のようなエラーも実行時に発生することに注意してください。例えば'ast.parse'は例えば' SyntaxError'を発生させることができます。 – mgilson

答えて

4

まあ、例外タイプは、raise <exception>を介して実行時にを解決することができます。しかし、私はあなたがこれを理解し、Pythonが(実行前に)あなたのコードを解釈する間に何が例外になるかを尋ねていると思います。実際にはかなりの数があります。

  • SyntaxError:それはコードを読み取るとこれはパーサによって提起されます。それは

  • IndentationError

  • など、間違った場所にキーワードを使用して、そのようなアンバランス括弧などの無効な構文から得られる:これは SyntaxErrorのサブクラスであり、あなたのコードが不適切なインデントを持っていたときに発生します。例は次のようになります。

    if condition: 
        line_indented_4_spaces 
        line_indented_3_spaces 
    
  • TabError:これはIndentationErrorのサブクラスであり、あなたが一貫性なく、ソースファイル内のタブとスペースを混在させるときに発生します。

  • SystemError:これは内部操作が失敗したときにインタープリタによって呼び出されます。通常は、Pythonのインストールがうまくいかず、再インストールが必要な場合があります。

  • MemoryError:これはSystemErrorと似ていますが、メモリ不足のため内部操作が失敗した場合に発生する可能性があります。

これらの例外はすべて、コードの実行が開始される前に発生する可能性があります。最初の3つはソースファイルが破損しているため、構文や字下げを修正するだけで解決できます。しかし後者の2つは内部的な操作が失敗したためにインタプリタ自身によって呼び出されます。これは、それらがまれであることを意味しますが、さらに深刻であり、修正するのが容易ではないことを意味します。

+0

'MemoryError'は、' ast'で面白いことをしたり、明示的に 'raise'したり、それらの他の抜け穴を実行しなくても、実行時に発生させることができます - システムのメモリにとって大きすぎる' list' 、 例えば。 –

1

Pythonコードで作業しているときに通常はコンパイルのステップがないので、PythonのすべてのエラーSyntaxErrorsが含まれていると実行時エラーがあると主張します。ただ、明らかにナンセンスだ(私たちも、それをnonsense.py名前でしょう)が、インタプリタを起動することができます

in xrange(5): 

たとえば、このファイルを書き込むことができます

$ python 
>>> try: 
...  import nonsense 
... except SyntaxError: 
...  print("A syntax error occurred at runtime!") 
... 
A syntax error occurred at runtime! 
>>> 

ので、そこには、SyntaxErrorが発生し、実行時にキャッチされました。私の考えでは、少なくとも実行時エラーであることを示しています。

+0

これは、実行中にモジュールが*インポートされているために機能します。しかし、あなたが直接実行するファイルでは 'SyntaxError'をキャッチすることはできません。また、壊れたPythonのインストールによって引き起こされた 'SystemError'をキャッチすることはできません。私の答えに記載されている例外はすべて、コードが実行を開始する前に(実行前に)呼び出すことができます。 – iCodez

+0

正確に。 try/exceptブロックをnonsense.pyに移動し、コマンドラインから 'python。/ nonsense.py'を実行してください。試しにラップしても... SyntaxErrorを除いては捕まえられません。 –