【基本】Pythonのエラーハンドリング(例外処理)を解説!

2023-07-17

Pocket

こんにちは、爽です。皆さん、いかがお過ごしでしょうか?

今回はPythonのエラーハンドリング(例外処理)について確認します。
他の言語でもそうですが、アプリケーション実行中に予期せぬエラーが発生した場合、処理がその時点で終了してしまいます。従って、そのタイミングで何かしらの対策を施さないと、処理の途中でアプリケーションが終了してしまい、期待する処理結果にならなかった、、というようなことになりかねません。
そこで必要となるテクニックがエラーハンドリングです。エラーハンドリングを行うことで上記のような不安を解消することができます。その為、エラーハンドリングは非常に重要ですので、この記事で是非覚えておいていただければと思います。

■この記事の対象読者
・Pythonに興味がある方
・Pythonを学び始めてみたい方

・Pythonのエラーハンドリングについて詳細を知りたい方

なお、私はPythonをAnacondaをインストールしてJupyterで実行しています。MacのAnacondaのインストール方法とJupyterの使い方は下記記事にまとめているので良かったらご参考ください。

それではどうぞ!

エラーハンドリング

基本形

例えば下記のようにわざとエラーが発生するような書き方をすると当然ですがそこで処理が終了し、エラーメッセージが出力されます。

#0徐算エラー
10/0

#前の処理でエラーが発生している為実行されない
print('OK')

# ---------------------------------------------------------------------------
# ZeroDivisionError                         Traceback (most recent call last)
# Input In [1], in <cell line: 1>()
# ----> 1 10/0

# ZeroDivisionError: division by zero

上記をエラーハンドリングするにはtryキーワードとexceptキーワードを使います。Javaでいうtryとcatchですね。

try:
    10/0
except:
    pass

#処理が途中で終わらないのでここも実行される
print('OK')

# OK

上記のようにtryの中の処理でエラーが発生した場合はpassするというようにエラーハンドリングをすることで、アプリケーションの処理を最後まで実行することができました。

エラー内容を出力

上記のように実際にエラーが起きてるけど何のエラーが起きてるかを知りたい場合はExceptionキーワードとasキーワードを使います。

try:
    10/0
except Exception as e:
    #エラー内容を出力
    print(e)

print('OK')

# division by zero
# OK

なお、Exceptionキーワードはアプリケーションで発生するほぼすべてのエラーを拾ってくれるので便利ですが、PythonではこのExceptionキーワードを使うことでエラーハンドリングをすることは良くないとされているようです。ただ、実際の開発現場ではほぼExceptionで表現されている気がします。。
Exceptionの種類はPythonの公式ドキュメントにも載っているのでこちらも参考にしてください。

なお、exceptは幾つでも重ねることができます。

l = [1, 2, 3]

try:
    l[3]
#インデックスエラーは発生するのでこのexceptで例外をキャッチする
except IndexError as e:
    print(e)
except ZeroDivisionError as e:
    print(e)

print('OK')

# list index out of range
# OK

elseとfinally

exceptに続く形でelseキーワードとfinallyキーワードを使用することができます。
elseキーワードの中に書かれた処理はtryの中の処理が正常終了した場合に実行され、例外が発生した場合には実行されません。例外が発生しなかった場合に絶対に実行したい処理がある場合はこのelseの中に処理を書きます。

l = [1, 2, 3]

try:
    l[1]
except IndexError as e:
    print(e)
except ZeroDivisionError as e:
    print(e)
#tryの処理が正常終了したため、elseの処理が実行される
else:
    print('else')

print('OK')

# else
# OK

また、finallyキーワードの中に書かれた処理はtryで例外が発生してもしなくても必ず実行されます。

#tryが正常終了の場合
l = [1, 2, 3]

try:
    l[2]
except IndexError as e:
    print(e)
except ZeroDivisionError as e:
    print(e)
except Exception as e:
    print(e)
else:
    print('else')
#例外が発生使用がしまいが必ず実行される
finally:
    print('finally')

print('OK')

# list index out of range
# finally
# OK
#tryがエラーの場合
l = [1, 2, 3]

try:
    del l
    print(l)
except IndexError as e:
    print(e)
except ZeroDivisionError as e:
    print(e)
except Exception as e:
    print(e)
else:
    print('else')
#例外が発生しようがしまいが必ず実行される
finally:
    print('finally')

print('OK')

# name 'l' is not defined
# finally
# OK

独自例外処理

Pythonの公式ドキュメントを見れば分かりますがPythonでは、大抵の例外が定義されています。しかし、Pythonで用意されている例外以外にも自分で例外を定義して使うことができます。
例えば下記のように処理結果が奇数になる場合のみ結果を返したい場合、処理結果が偶数になる場合は独自例外を発生させることでこの関数の処理結果は奇数であることを担保できます。

#独自例外の作成
class evenException(Exception):
    pass
    
a = 10
b = 2

def odd_func(a, b):
    #偶数の場合は独自例外を発生させる
    if a % b == 0:
        raise myException("This is even!!")
    else:
        return a / b

odd_func(a, b)

# ---------------------------------------------------------------------------
# myException                               Traceback (most recent call last)
# Input In [3], in <cell line: 15>()
#      12     else:
#      13         return a / b
# ---> 15 odd_func(a, b)

# Input In [3], in odd_func(a, b)
#       8 def odd_func(a, b):
#       9     #引数のbが0であるため、この分岐に入り、独自例外が実行される
#      10     if a % b == 0:
# ---> 11         raise myException("This is even!!")
#      12     else:
#      13         return a / b

# evenException: This is even!!

ちなみに上記のようにraiseキーワードは、任意の処理で例外を無理矢理発生させることができるため、例外ケースのテストの時に非常に有効です。

参考資料

この記事はUdemyのPython+FlaskでのWebアプリケーション開発講座!!~0からFlaskをマスターしてSNSを作成する~という講座と現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルという2つの講座を参考にさせていただき、作成しました。

Python+FlaskでのWebアプリケーション開発講座!!~0からFlaskをマスターしてSNSを作成する~

Udemyより抜粋

当講座は最低限のWeb開発の知識を知っていることが前提とはなりますが、とにかくPythonの説明とFlask開発の為の説明が充実しているのでおすすめです。
28時間に及ぶ長丁場の講座にはなりますが、絶対に聞く価値がある講座です。
これをマスターすればPythonでどんなアプリケーションでも作ることができると思います。

当講座のおすすめポイントを以下にまとめておきます。

当講座のおすすめポイント

とにかく説明が充実している

Webアプリ開発におけるフレームワークがなぜ有益なのか知ることができる

セキュリティ対策、Ajaxなどの技術も知れる

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

画像に alt 属性が指定されていません。ファイル名: a1ee3d048d6aa860662b6f58c4aa167f-1024x328.png
Udemyより抜粋

当講座はPythonの基礎から応用まで幅広く学べる講座なのでおすすめです。
この講座の講師はとにかくPythonについての知識が豊富ですし、話も適度な速さで聞き取りやすいです。さすがのシリコンバレーです。
また、最後の方に機械学習で使うライブラリについても解説があるので、データサイエンス・AIについても多少知ることができます。

当講座のおすすめポイントを以下にまとめておきます。

当講座のおすすめポイント

シリコンバレーで働いているということもあり、講師のPythonの知識が豊富

話も適度な速さで聞き取りやすい

コードの意味だけでなく、それをどう応用するかまで解説してくれる

なお、Udemyについては以下の記事でまとめていますのでご参考ください。

まとめ

ということで、今回はPythonのエラーハンドリング(例外処理)について解説しました。
通常、エラーハンドリングをしないアプリケーションはないと思えるほど、エラーハンドリングはアプリケーション開発の基本であり欠かせないテクニックと思いますので、是非押さえておきたいですね。
では、今回はここまでとさせていただきます。