Select Language

AI Technology Community

6.2、Python try except文:キャプチャ例外

例外を捕捉するとは、あるコードブロック内で例外が発生した場合、対応する例外処理コードを定義する必要があることです。このようにして例外が処理され、最後まで全体のプログラムが終了するまで上方に伝播することはありません。

以下に、例外を捕捉するいくつかの方法を紹介します。

1) 任意の例外を捕捉する

最も簡単な処理方法は、任意の例外を捕捉することです。方法は、以下の分岐文を使用することです:

except:

この分岐は、捕捉されていない任意の例外を捕捉します。

>>> try:                                                              
...     a = 12 / 0                     # 正常分岐
... except:                            # 例外処理分岐
...     print("Got and exception")     # 例外分岐処理関数
...                                                  # すべての例外分岐が終了しました
Got and exception                      # 4行目のコードの実行結果

2) 特定のタイプの例外を捕捉する

もちろん、特定の例外を捕捉することもできます。つまり、特定の例外のみを処理し、他の例外はより上位のコードで捕捉されるか、全体のプログラムが終了します。

>>> try:                           # 例外捕捉エリア
...     a = 12 / 0
... except ZeroDivisionError:      # ZeroDivisionErrorタイプの例外のみを捕捉
...     print("Divided By Zero")
...                                            # 例外分岐が終了しました
Divided By Zero                    # 4行目の出力


投げられた例外と捕捉するタイプが一致しない場合、捕捉されません。

>>> try:                                  # 例外捕捉エリア
...     a = non_exist_var                 # 存在しないオブジェクトを使用
... except ZeroDivisionError:             # 0で割る例外のみを捕捉
...     print("Divided By Zero")
...                                       # すべての例外処理分岐が終了しました
Traceback (most recent call last):        # 処理されなかったため、プログラムが終了しました
  File "<stdin>", line 2, in <module>
NameError: name 'non_exist_var' is not defined


Expectionタイプの例外オブジェクトを捕捉することで、任意のタイプの例外を捕捉することができます。Exceptionは任意の例外に一致するため、例外が上位のコードに漏れる心配はありません。最も一般的な使い方は、最初に特定の例外を処理し、最後に任意の例外を捕捉する分岐を配置して、漏れたすべての例外を処理することです。以下の例のように:

>>> def div(a, b):                            # 除算関数を定義
...     try:                                                                            # 例外捕捉エリアに入る
...         c = a / b
...         return c
...     except ZeroDivisionError as ex_obj:   # 0で割る例外
...         print(u"0で割る例外, エラーメッセージ: %s" % ex_obj)
...     except Exception as e:                # 他のすべての例外
...         print(u"不明な例外, エラーメッセージ: %s" % e)
...
>>> div(20, 0)                                # 5行目で捕捉されました
0で割る例外, エラーメッセージ: division by zero
>>> div("abc", 0)                             # 7行目で捕捉されました
不明な例外, エラーメッセージ: unsupported operand type(s) for /: 'str' and 'int'

3) 複数の例外を捕捉する

複数の捕捉文を定義して、異なる例外を捕捉することができます。これにより、異なる例外に対して異なる処理を行うことができます。

>>> def try_demo(x, y, z):
...     try:                                   # 例外捕捉エリア
...             a = x[y] / z
...     except ZeroDivisionError:              # 0で割る例外を捕捉
...             print("Divided By Zero")       
...     except IndexError:                     # インデックスエラーを捕捉
...             print("Index Error")
...                                            # 例外捕捉エリアが終了しました
>>> try_demo([1, 2], 3, 3)
Index Error                                    # 7行目の出力
>>> try_demo([1, 2], 1, 0)
Divided By Zero                                # 5行目の出力


ここで注意する必要があるのは、例外オブジェクトは一度しか捕捉されません。2つの例外処理分岐が同じタイプの例外を処理できる場合、前の分岐がトリガーされ、後の分岐はトリガーされません。これが、Exception分岐を最後に配置する理由です。なぜなら、Exceptionは任意の例外を捕捉できるため、最初に配置すると、他の例外処理分岐が決してトリガーされなくなるからです。以下の例のように:

>>> def div(a, b):                         # 除算関数を定義
...     try:                                                                           # 例外捕捉エリアに入る
...         c = a / b
...         return c
...     except Exception:                   # 任意の例外を捕捉します
...         print(u"Exceptionタイプの例外を捕捉しました") # 任意の例外を捕捉する機会がありません。なぜなら、前の分岐がすべての例外を捕捉しているからです。
...     except ZeroDivisionError :
...         print(u"ZeroDivisionErrorタイプの例外を捕捉しました")
...
>>> div(8, 0)
Exceptionタイプの例外を捕捉しました                    # 6行目の出力


もう1つの例外タイプ、baseExceptionがあります。Exceptionはこのタイプから派生しているため、Exceptionと同様に、すべてのタイプの例外を捕捉することができます。以下は、baseExceptionを最初に配置した場合で、すべての捕捉分岐をブロックします。

>>> def div(a, b):
...    

post
  • 7

    item of content
例外処理は現代のプログラミング言語の基本的な特性でもあり、正常な分岐と例外の分岐を切り分けることができます。C言語とは異なり、正常な分岐と例外の分岐が混在することはありません。
Pythonにおいて例外は特別なオブジェクトであり、この例外オブジェクトを通じて例外発生時の情報を例外処理関数に渡すことができます。
この章では、例外の捕捉方法、例外情報の取得方法、特定の例外の無視、例外のスロー方法、カスタム例外オブジェクトの作成、そしてPython 2とPython 3における例外処理の類似点と相違点について説明します。最後に、一般的なシステム定義の例外についても紹介します。