プログラム実行中に考慮しなくてはいけないことの1つに、エラーや例外の処理があります。
大抵のプログラム言語には、これを行うための専用の構文が存在しています。例えば、Javaの言語でいう「try-catch文」です。
今回は、そんなpythonの例外処理における補足情報について、まとめます。
例外処理
Pythonの例外処理の基本形である「try」「except」 を使用した構文を理解している方向けです。
こちらについて分からない場合は、まず前編をご覧ください。
except文の中で処理をしないようにする
例外がexcept に渡されてもなにも処理させたくない場合があるかもしれません。その場合は、「pass」を使用します。
コードサンプル:
try:
no_code()
except:
pass
no_code()が実装されていない関数である場合、上記のようなコードを作成すると、実行結果では何も表示されずに処理が終了します。
なお、pass は例外処理に関わらず、様々な所で利用することができます。
自作の例外を発生させる(raise)
前編/中編で記載している例外は、Pythonで既に組み込まれている例外でした。
しかし、Python では、自作の例外を発生させることも可能です。
自作の例外を発生させるためには、raise を用います。
実際のソースコードで一例を示します。
コードサンプル:
try:
raise(“Raise an exception in the Try process.”)
except:
print(“Exception is occured.”)
実行結果:
Exception is occured.
なお、raise により用いた例外では、全ての組み込み例外の親となるException に投げられます。
そのため、複数の特定のExceptionを指定している場合は、以下のようなふるまいをします。
コードサンプル:
try:
raise(“Raise an exception in the Try process.”)
except NameError:
print(“NameError is occured.”)
except Exception:
print(“Exception is occured.”)
実行結果:
Exception is occured.
また、raise の( )の中の文は、例外のメッセージになります。このメッセージを出力したい場合は、以下の2ステップ行う必要があります。
- Exceptionに属することを明示する。
- 実体(オブジェクト)として扱う。(前編を参照)
実際のソースコードで一例を示します。
コードサンプル:
try:
raise Exception(“Raise an exception in the Try process.”)
except Exception as e:
print(e)
実行結果:
Raise an exception in the Try process.
上記では、try文のraise の後に「Exception」を追加し、Exceptionに属することを明示しています。
また、「except Exception as e」と記載を改め、オブジェクトであることを明記し、「print(e)」でメッセージを出力しています。
もし、独自の例外をExceptionとは別に処理したい場合は、「クラス」の知識が必要になります。(「クラス」の詳細は、こちら:実装と利用・継承)
実施することは、Exceptionの子として独自の「クラス」を作成し、それをexceptで指定します。
コードサンプル:
class sampExcept(Exception):
pass
def sample():
try:
raise sampExcept(“Raise an exception in the Try process.”)
except sampExcept:
print(“sampExcept is processed.”)
except Exception:
print(“Exception is processed.”)
sample()
実行結果:
sampExcept is processed.
上記コードサンプルでは、Exceptionを継承した「sampExcept」というクラスを作成しています。
raise では、作成した「sampExcept」に属すること明示し、exceptでも「sampExcept」を指定しています。
try-exceptと条件分岐の使い分け
If文による条件分岐でも、例外処理ができるのでは?という疑問を持つ人はいないでしょうか?
たしかに、If文による条件分岐でも例外処理はできるかもしれません。
条件分岐を用いる際に考慮することを考えてみましょう。発生タイミングが想定でき、例外が発生する条件が分かっていないと用いることが難しいと思います。
つまり、条件分岐の場合では、発生し得るタイミングに都度条件分岐を組み込まなければなりません。これは、非常に手間になります。また、発生した例外をどうこうするより、例外が発生するきっかけを回避する方が適していると思います。
しかし、try-exceptでは、try文内に記載した範囲内で起こった例外に対して処理することができます。
また、極端な話、発生する例外の種類や条件について、考慮しなくても対応できます。
つまり、例外に対して、条件分岐では「局所的に処理」を行え、try-exceptでは「特定の範囲に処理」をすることができるのです。プログラム(ソースコード)を作成していく中で、どちらの方が考慮漏れ等のリスクを回避できるかは明白ですね。
まとめ
今回は、pythonにおける例外処理の後編としてpythonの例外処理における補足情報について記載しました。
pythonの例外処理の説明としては、3部構成でまとめていますので、他の記事についても、参考にしてみて下さい。