Python Try Except は、クラッシュせずに例外を適切に処理するために Python で使用される構造です。
例外処理により、プログラム コードの信頼性が高まり、失敗する可能性が低くなります。この記事では、例外の処理と、例外処理が理想的な一般的なシナリオについて説明します。おまけとして、例外を発生させる方法についても説明します。
例外処理とは何ですか?
例外とは、プログラムの実行中に発生する重大な異常およびエラーです。処理されないと、例外が発生してプログラムがクラッシュします。したがって、例外処理は、プログラムがクラッシュしないように例外を処理する方法です。
例外とは何かを説明する例を次に示します。
user_input = input("Enter a number: ")
num = int(user_input)
print("Your number doubled is:", num * 2)
一見すると、上記のプログラムには何も問題がないように見えます。ユーザーからの入力を受け取り、それを整数に変換します。次に、ユーザーが指定した整数を 2 倍にして表示します。
入力値 5 を指定して実行すると、プログラムは正常に実行されます。以下を参照してください。
しかし、同じプログラムを再度実行したとします。今回のみ、入力として 5 を使用する代わりに、文字列「hello」を入力します。プログラムがクラッシュします。文字列「hello」は整数に変換できないため、例外が発生し、プログラムがクラッシュします。
なぜ例外が発生するのか、なぜ例外を処理する必要があるのか?
プログラムをコーディングするときにプログラムを関数に分解することが多いため、例外が発生します。これらの関数は、さまざまなタスクを実行するために呼び出されます。
上の例では、input 関数を呼び出してユーザーの入力を受け取り、次に int 関数を呼び出して文字列入力を整数に変換し、最後に print 関数を呼び出して出力を表示しました。
ただし、関数がアクションを実行するときに、処理方法がわからないエラーが発生する可能性があります。この場合、上記の関数は実行を停止し、エラーが発生したことを通知する必要があります。通信するために、例外が発生します。
関数と呼ばれるコードは、これらの例外をリッスンし、適切に反応する責任があります。これを行わないと、前の例で見たように、エラーが発生した後にプログラムがクラッシュします。
したがって、例外は本質的に、呼び出された関数がそれを呼び出したコードに救難信号を送信できるようにする通信メカニズムです。そして、前にほのめかした適切な反応が例外処理の本質です。
さまざまな種類の例外
すべての例外が同じではないことを知っておくことが重要です。発生したエラーごとにさまざまな種類の例外が発生します。たとえば、数値をゼロで除算しようとすると、ZeroDivisionError が発生します。また、無効なデータ型で操作を試行すると、TypeError が発生します。 例外の種類 の完全なリストを次に示します。
例外を処理する方法
前に説明したように、例外は、呼び出した関数によって生成される救難信号です。したがって、私たちのコードはこれらの救難信号を聞き、鳴らされたときに適切に反応する必要があります。例外を適切に処理するために、Python Try Except コンストラクトを使用します。コンストラクトの基本構造は次のとおりです。
try:
# Code to try and run
except:
# Code to run if an exception is raised
finally:
# Code to run in the end, whether or not an exception is raised
ご覧のとおり、この構造は以下で説明する 3 つのキーワードで構成されています。
試す
try
キーワードは、Python Try Except 構造の始まりを示します。さらに、例外が発生する可能性のあるコード ブロックをマークします。これは、ブロック内のコードを実行しようとする Python インタープリターへの命令です。例外が発生した場合、プログラムは直ちに停止し、Exception ブロック内に記述されたコードを実行します。
を除外する
except
キーワードは、try ブロックの実行中に例外が発生した場合に実行されるコード ブロックをマークします。発生する可能性のあるさまざまなタイプの例外に対して、複数のブロックを定義できます。これについては後で説明します。
ついに
finally
キーワードは、Python Try Except で使用される 3 番目で最後のキーワードです。例外が発生したかどうかに関係なく実行されるコードのブロックをマークします。
例
上記のキーワードが例外を処理する方法の例を次に示します。前の例をこれに変更します。
try:
user_input = input("Enter a number: ")
num = int(user_input)
print("Your number doubled is:", num * 2)
except:
print("Something went wrong")
finally:
print("This code will be executed no matter what")
有効な入力である 5 を入力として上記のコードを実行すると、次の結果が得られます。
「hello」を入力として実行すると、次の結果が得られます。
したがって、try ブロック内のコードの実行中に例外が発生しなかった場合、コンピューターは
finally
ブロックに進みました。ただし、try ブロック内のコードの実行中に例外が発生すると、コンピューターは例外ブロックに移動し、その後、
finally
ブロックに移動しました。
特定の種類のエラーの例外を処理することもできます。たとえば、
ValueError
と
KeyboardInterrupt
例外を特定の方法で処理したい場合は、上記のコードを次のように変更できます。
try:
user_input = input("Enter a number: ")
num = int(user_input)
print("Your number doubled is:", num * 2)
except ValueError:
print("Value can't be converted to int")
except KeyboardInterrupt:
print("Received a keyboard interrupt")
except:
print("Catch-all exception block")
finally:
print("This code will be executed no matter what")
上記のコードには、
except
ブロックが 3 つあります。最初の
except
ブロックは
ValueError
例外のみをキャッチし、2 番目のブロックは
KeyboardInterrupt
例外のみをキャッチします。最後の
except
ブロックには、リッスンする関連例外タイプがありません。その結果、最初の 2 つのブロックでキャッチされなかった残りの例外がキャッチされます。
上記のコードを実行すると、次のような出力が得られるはずです。
例外が発生すると、例外オブジェクト内の例外に関する詳細情報を取得できます。例外オブジェクトにアクセスするには、
as
キーワードを使用します。次のように使用されます。
try:
user_input = input("Enter a number: ")
num = int(user_input)
print("Your number doubled is:", num * 2)
except ValueError as e:
print("Value Error:", e)
except KeyboardInterrupt as e:
print("Keyboard Interrupt:", e)
except Exception as e:
print("Some other exception", e)
例外を発生させる方法
これまでは、他の関数によって発生した例外を処理してきました。ただし、コード内で例外を発生させることも可能です。例外を発生させるには、raise キーワードを使用します。また、発生させたい例外の種類と、その例外に関連付けられた人間が判読できるメッセージを表すクラスも指定します。
次の例では、Exception クラスを使用して一般的な例外を発生させます。次に、メッセージをクラスのコンストラクターに渡します。
raise Exception('Something went wrong')
上記のスニペットをプログラムとして実行すると、次のような出力が得られます。
さまざまな種類の例外を指定することもできます。たとえば、値のデータ型が間違っている場合に、TypeError 例外を発生させることができます。
def double(x):
if isinstance(x, int):
return x * 2
else
raise TypeError('x should be an int')
または、指定された値が許容範囲外の場合は、ValueError を発生させることができます。
def say_hello(name):
if name == '':
raise ValueError('Value outside bounds')
else:
print('Hello', name)
Exception クラスをサブクラス化して例外タイプを作成することもできます。以下に例を示します。
class InvalidHTTPMethod(Exception):
pass
上の例では、Exception クラスを継承するクラス InvalidHTTPMethod を作成しました。以前と同じ方法でこれを使用して例外を発生させることができます。
raise InvalidHTTPMethod('Must be GET or POST')
例外処理の一般的な使用例
例外処理は多くのシナリオで使用されます。前の例では、ユーザー入力による例外を処理する方法を示しました。このセクションでは、例外処理が役立つ 2 つの追加の状況について説明します。これらは、失敗したネットワーク要求の結果として例外を処理することと、ファイルの読み取り中に例外を処理することです。
ネットワークリクエストの実行
以下の例では、Google にリクエストを行っています。それらを処理するために例外をリッスンしています。これらの例外は、requests.Exceptions オブジェクトで定義されます。
import requests
try:
response = requests.get("https://google.com")
# Check if the response status code is in the 200-299 range (successful response)
if 200 <= response.status_code < 300:
print("Request was successful!")
else:
print(f"Request failed with status code: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"RequestException occurred: {e}")
except requests.exceptions.ConnectionError as e:
print(f"ConnectionError occurred: {e}")
except requests.exceptions.Timeout as e:
print(f"Timeout occurred: {e}")
except requests.exceptions.TooManyRedirects as e:
print(f"TooManyRedirects occurred: {e}")
except requests.exceptions.HTTPError as e:
print(f"HTTPError occurred: {e}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
ファイルからのデータの読み取り
この最後の例では、hello.txt ファイルからデータを読み取ります。 FileNotFound エラーや IOError など、発生する可能性のある一般的な例外も処理します。
try:
with open(file_path, 'r') as file:
data = file.read()
print("File contents:")
print(data)
except FileNotFoundError as e:
print(f"FileNotFoundError occurred: {e}")
except IOError as e:
print(f"IOError occurred: {e}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
結論
この記事では、例外とは何か、また例外が発生する理由について説明しました。また、コードの信頼性を高め、クラッシュを防ぐためにそれらを処理することも確立しました。最後に、例外を処理する方法といくつかの例外を発生させる方法について説明しました。
次に、一般的な Python エラーの種類とその解決方法を確認してください。