Python例外:はじめに

Python例外:はじめに

Pythonプログラムは、エラーが発生するとすぐに終了します。 Pythonでは、エラーは構文エラーまたは例外です。 この記事では、例外とは何か、そして例外が構文エラーとどのように異なるかについて説明します。 その後、例外の発生とアサーションの作成について学習します。 次に、try and exceptブロックのデモンストレーションで終了します。

Pythonの例外の概要、width = 1394、height = 411

無料のPDFダウンロード: Python 3 Cheat Sheet

例外と構文エラー

構文エラーは、パーサーが誤ったステートメントを検出したときに発生します。 次の例をご覧ください。

>>> print( 0/0 ))
  File "<stdin>", line 1
    print( 0/0 ))
                  ^
SyntaxError: invalid syntax

矢印は、パーサーが*構文エラー*に遭遇した場所を示しています。 この例では、1つのブラケットが多すぎます。 それを削除して、コードを再度実行します。

>>> print( 0/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

今回は、*例外エラー*に遭遇しました。 このタイプのエラーは、構文的に正しいPythonコードがエラーになるたびに発生します。 メッセージの最後の行は、どのタイプの例外エラーに遭遇したかを示しています。

Pythonは、「+ exception error 」というメッセージを表示する代わりに、発生した例外エラーのタイプを詳しく説明します。 この場合、それは ` ZeroDivisionError +`でした。 Pythonには、https://docs.python.org/3/library/exceptions.html [さまざまな組み込み例外]と、自己定義の例外を作成する可能性が付属しています。

例外を発生させる

条件が発生した場合、 `+ raise +`を使用して例外をスローできます。 このステートメントは、カスタム例外で補完できます。

`+ raise +`を使用して特定の条件が発生したときにエラーをスローする場合は、次のように実行できます。

x = 10
if x > 5:
    raise Exception('x should not exceed 5. The value of x was: {}'.format(x))

このコードを実行すると、出力は次のようになります。

Traceback (most recent call last):
  File "<input>", line 4, in <module>
Exception: x should not exceed 5. The value of x was: 10

プログラムは停止し、画面に例外を表示して、何が間違っていたかについての手がかりを提供します。

`+ AssertionError +`例外

プログラムが途中でクラッシュするのを待つ代わりに、https://dbader.org/blog/python-assert-tutorial [Pythonでアサーションを作成する]から開始することもできます。 特定の条件が満たされていることを「+ assert 」します。 この条件が「 True 」であることが判明した場合、それは素晴らしいことです! プログラムは続行できます。 条件が「 False 」であることが判明した場合、プログラムに「 AssertionError +」例外をスローさせることができます。

Python assert statement、width = 1394、height = 411

Linuxシステムでコードが実行されると断言されている次の例をご覧ください。

import sys
assert ('linux' in sys.platform), "This code runs on Linux only."

このコードをLinuxマシンで実行すると、アサーションは成功します。 このコードをWindowsマシンで実行すると、アサーションの結果は「+ False +」になり、結果は次のようになります。

Traceback (most recent call last):
  File "<input>", line 2, in <module>
AssertionError: This code runs on Linux only.

この例では、 `+ AssertionError +`例外をスローすることは、プログラムが最後に行うことです。 プログラムは停止し、継続しません。 それがあなたの望むものではない場合はどうなりますか?

`+ try `および ` except +`ブロック:例外処理

Pythonの `+ try `および ` except `ブロックは、例外をキャッチして処理するために使用されます。 Pythonは、プログラムの「通常の」部分として、「 try 」ステートメントに続くコードを実行します。 ` except `ステートメントに続くコードは、前の ` try +`句の例外に対するプログラムの応答です。

tryおよびexceptステートメントを示す図、幅= 1394、高さ= 556

前に見たように、構文的に正しいコードでエラーが発生すると、Pythonは例外エラーをスローします。 この例外エラーは、処理されない場合にプログラムをクラッシュさせます。 `+ except +`句は、プログラムが例外にどのように応答するかを決定します。

次の関数は、 `+ try `および ` except +`ブロックを理解するのに役立ちます。

def linux_interaction():
    assert ('linux' in sys.platform), "Function can only run on Linux systems."
    print('Doing something.')

`+ linux_interaction()`はLinuxシステムでのみ実行できます。 この関数の ` assert `は、Linux以外のオペレーティングシステムで呼び出すと、 ` AssertionError +`例外をスローします。

次のコードを使用して、関数に `+ try +`を与えることができます:

try:
    linux_interaction()
except:
    pass

ここでエラーを処理する方法は、「+ pass +」を渡すことです。 このコードをWindowsマシンで実行すると、次の出力が得られます。

何もありません。 ここでの良い点は、プログラムがクラッシュしなかったことです。 ただし、コードを実行するたびに何らかのタイプの例外が発生したかどうかを確認できたらうれしいです。 このため、次のように、「+ pass +」を有益なメッセージを生成するものに変更できます。

try:
    linux_interaction()
except:
    print('Linux function was not executed')

Windowsマシンでこのコードを実行します。

Linux function was not executed

この関数を実行しているプログラムで例外が発生すると、プログラムは続行し、関数呼び出しが成功しなかったという事実を通知します。

表示されなかったのは、関数呼び出しの結果としてスローされたエラーのタイプです。 何が間違っていたのかを正確に確認するには、関数がスローしたエラーをキャッチする必要があります。

次のコードは、 `+ AssertionError +`をキャプチャし、そのメッセージを画面に出力する例です。

try:
    linux_interaction()
except AssertionError as error:
    print(error)
    print('The linux_interaction() function was not executed')

Windowsマシンでこの関数を実行すると、次が出力されます。

Function can only run on Linux systems.
The linux_interaction() function was not executed

最初のメッセージは `+ AssertionError +`で、この関数はLinuxマシンでのみ実行できることを通知します。 2番目のメッセージは、実行されなかった機能を示します。

前の例では、自分で作成した関数を呼び出しました。 関数を実行すると、 `+ AssertionError +`例外をキャッチし、画面に出力しました。

ファイルを開いて組み込み例外を使用する別の例を次に示します。

try:
    with open('file.log') as file:
        read_data = file.read()
except:
    print('Could not open file.log')

_file.log_が存在しない場合、このコードブロックは次を出力します。

Could not open file.log

これは情報メッセージであり、プログラムは引き続き実行されます。 Python docsで、ここで使用できる組み込みの例外がたくさんあることがわかります。 そのページで説明されている1つの例外は次のとおりです。

_ _ 例外 + FileNotFoundError +

ファイルまたはディレクトリが要求されたが、存在しない場合に発生します。 errno ENOENTに対応します。 _ _

このタイプの例外をキャッチして画面に出力するには、次のコードを使用できます。

try:
    with open('file.log') as file:
        read_data = file.read()
except FileNotFoundError as fnf_error:
    print(fnf_error)

この場合、_file.log_が存在しない場合、出力は次のようになります。

[Errno 2] No such file or directory: 'file.log'

`+ try `句で複数の関数呼び出しを使用して、さまざまな例外をキャッチすることができます。 ここで注意すべきことは、例外が発生するとすぐに ` try +`句のコードが停止することです。

警告:「+ Exception 」をキャッチすると、すべてのエラーが隠されます(完全に予期しないエラーも)。 これが、Pythonプログラムで裸の ` except +`句を避けるべき理由です。 代わりに、キャッチして処理する_特定の例外クラス_を参照する必要があります。 これが良いアイデアである理由については、https://realpython.com/the-most-diabolical-python-antipattern/[このチュートリアル]をご覧ください。

次のコードを見てください。 ここでは、最初に `+ linux_interaction()+`関数を呼び出してからファイルを開こうとします:

try:
    linux_interaction()
    with open('file.log') as file:
        read_data = file.read()
except FileNotFoundError as fnf_error:
    print(fnf_error)
except AssertionError as error:
    print(error)
    print('Linux linux_interaction() function was not executed')

ファイルが存在しない場合、Windowsマシンでこのコードを実行すると、次が出力されます。

Function can only run on Linux systems.
Linux linux_interaction() function was not executed

`+ try +`句内で、すぐに例外に遭遇し、_file.log_を開こうとする部分に到達しませんでした。 Linuxマシンでコードを実行するとどうなるかを見てみましょう。

[Errno 2] No such file or directory: 'file.log'

主なポイントは次のとおりです。

  • `+ try +`句は、最初の例外が発生するまで実行されます。

  • `+ except +`節、または例外ハンドラー内で、プログラムが例外にどのように応答するかを決定します。

  • 複数の例外を予測し、プログラムがそれらにどのように応答するかを区別できます。

  • 裸の `+ except +`句の使用を避けます。

`+ else +`句

Pythonでは、 `+ else +`ステートメントを使用して、例外がない場合にのみ特定のコードブロックを実行するようにプログラムに指示できます。

Pythonのtry、except、およびelseステートメントの図、 width = 1394、height = 783

次の例を見てください。

try:
    linux_interaction()
except AssertionError as error:
    print(error)
else:
    print('Executing the else clause.')

このコードをLinuxシステムで実行すると、出力は次のようになります。

Doing something.
Executing the else clause.

プログラムは例外に遭遇しなかったため、 `+ else +`句が実行されました。

また、 `+ try `を使用して ` else +`句内でコードを実行し、そこで発生する可能性のある例外をキャッチすることもできます。

try:
    linux_interaction()
except AssertionError as error:
    print(error)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(fnf_error)

Linuxマシンでこのコードを実行すると、次の結果が得られます。

Doing something.
[Errno 2] No such file or directory: 'file.log'

出力から、 `+ linux_interaction()`関数が実行されたことがわかります。 例外が発生しなかったため、_file.log_を開こうとしました。 そのファイルは存在せず、ファイルを開く代わりに、 ` FileNotFoundError +`例外をキャッチしました。

`+ finally +`を使用した後のクリーンアップ

コードを実行した後にクリーンアップするために、何らかのアクションを常に実装しなければならないと想像してください。 Pythonでは、 `+ finally +`句を使用してこれを行うことができます。

else else以外の試行を説明する図、width = 1394、 height = 1000

次の例を見てください。

try:
    linux_interaction()
except AssertionError as error:
    print(error)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(fnf_error)
finally:
    print('Cleaning up, irrespective of any exceptions.')

前のコードでは、 `+ finally `句のすべてが実行されます。 ` try `節または ` else +`節のどこかで例外が発生しても問題ありません。 Windowsマシンで前のコードを実行すると、次の結果が出力されます。

Function can only run on Linux systems.
Cleaning up, irrespective of any exceptions.

まとめ

構文エラーと例外の違いを見た後、Pythonで例外を発生、キャッチ、および処理するさまざまな方法について学びました。 この記事では、次のオプションを見ました。

  • `+ raise +`を使用すると、いつでも例外をスローできます。

  • `+ assert +`を使用すると、特定の条件が満たされているかどうかを確認し、満たされていない場合は例外をスローできます。

  • `+ try +`句では、例外が発生するまですべてのステートメントが実行されます。

  • `+ except +`は、try句で発生した例外をキャッチして処理するために使用されます。

  • `+ else +`を使用すると、try句で例外が検出されない場合にのみ実行されるセクションをコーディングできます。

  • `+ finally +`を使用すると、以前に発生した例外の有無にかかわらず、常に実行する必要があるコードのセクションを実行できます。

無料のPDFダウンロード: Python 3 Cheat Sheet

この記事が、例外を処理するときにPythonが提供しなければならない基本的なツールの理解に役立つことを願っています。