LoginSignup
4
5

More than 5 years have passed since last update.

pythonのエラーと例外

Posted at

はじめに

pythonの基礎として、エラーと例外について記載していきます。

構文エラー

構文自体が誤っている場合は構文エラーが出力されます。

>>> while a<3
  File "<stdin>", line 1
    while a<3
            ^
SyntaxError: invalid syntax

パーサーはエラーの発生している行を示し、エラーが検出された最初の位置を^で示します。

例外

構文として正しくても実行中に発生するエラーを例外と言います。

>>> 1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> abc*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'abc' is not defined
>>> "abc"+2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not int

例外の処理

例外を選別して処理することができます。

try:
    例外が発生する可能性がある処理
except 例外クラス名:
    例外が発生した場合の処理
else:
    例外が発生しなかった場合の処理
finally:
    例外が発生してもしなくても実行する処理

まず、tryとexceptの間処理が実行されます。
例外が発生しなければtry文は終了し、例外が発生するとexceptの後に移動、指定されている例外に一致する場合はexcept(ハンドラー)が実行されます。
もしexceptと一致しない場合は、例外エラーが出力されます。
※複数のハンドラーを指定することができます。 exceptでは複数の例外をタプルにして渡すことができます。
※外から呼び出されたユーザー定義関数の内部で発生した例外の処理も行います。

elseとfinally

try-exceptでは、elseを設けることができます。 例外が発生しなかった時に実行されるコードを書くのに使います。
elseは、全てのexceptよりも後ろに置かなければなりません。
またfinallyは「例外の発生に関係なく、最後に処理を実行します。

>>> try:
...     a = 10 / 0
...     print("{0}".format(a))
... except ZeroDivisionError:
...     print("ZeroDivisionError!!")
... else:
...     print("else statement")
... finally:
...     print("finally statement")
... 
ZeroDivisionError!!
finally statement
>>> try:
...     a = 10 / 1
...     print("{0}".format(a))
... except ZeroDivisionError:
...     print("ZeroDivisionError!!")
... else:
...     print("else statement")
... finally:
...     print("finally statement")
... 
10.0
else statement
finally statement

raise

raiseを使うと特定の例外を発生させることができます。

>>> raise NameError('error!')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: HiThere

発生させたい例外を発生させたい箇所に記述し
except句の中でraise と記述することで例外を返すこともできます。

いい例が思いつかなかったのでこちらを参照にしました。

>>>try:
...    raise NameError('HiThere')
>>>except NameError:
...    print('An exception flew by!')
...    raise

終わり

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5