Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの例外処理を徹底解説!発生原因からraise文・try...exceptの使い方まで

Pythonでは、インタープリタによって自動的に例外が発生するだけでなく、開発者が意図的に例外を発生させることもできます。組み込み例外を活用すれば、プログラム内で起こりやすいエラーを効率的に検出できます。

この記事では、「例外とは何か」「どのように使われるのか」を解説し、実際に例外を発生させてコードで扱う方法まで、具体例とともにわかりやすく紹介します。

例外とは何か?

例外は「論理エラー」とも呼ばれ、プログラムの実行中に発生するエラーのことです。

Pythonには大きく分けて2種類のエラーがあります。「構文エラー」と「実行時エラー」です。

構文エラーは、プログラムが実行される前に検出されます。構文エラーがある場合、Pythonはそのコードを解釈できないため、プログラム自体が起動しません。

一方、実行時エラー(例外)は、Pythonがプログラムを実行している最中に発生します。たとえば30行目で例外が発生した場合、最初の29行は正常に実行され、30行目でプログラムが停止します。

以下は例外の一例です。

Traceback (most recent call last):
  File "main.py", line 6, in <module>
	s_names.append(n)
AttributeError: 'str' object has no attribute 'append'

この例外は、Pythonが残りのコードを実行できなかったことを示しています。例外に遭遇したときは、メッセージを注意深く読むことが重要です。エラーメッセージには、問題を解決するために必要な情報のほとんどが含まれています。

それでは、エラーメッセージの最終行を分解して見てみましょう。

AttributeError: 'str' object has no attribute 'append'

この場合、エラーの種類は AttributeError です。これは「存在しない属性を参照しようとした」ことを意味します。エラーメッセージによると、文字列オブジェクトに対して append() を使用しようとしていることがわかります。

文字列オブジェクトは append() メソッドをサポートしていないため、次のステップとしては、文字列における同等の機能を探すのが良いでしょう。それが連結です。これで、問題を解決するための具体的なアプローチが見つかりました。

例外に遭遇するのはどんな場面?

プログラマーがコード内のエラーを検出できるよう、Pythonにはさまざまな組み込み例外が用意されています。これらの例外を活用すれば、コードの問題原因を特定し、修正につなげられます。ここでは、特によく遭遇する代表的な例外をいくつか紹介します。

  • TypeError: 型が対応していないオブジェクトに関数を適用したときに発生します。(例:TypeError: can only join an iterable)
  • SyntaxError: プログラムの実行前に発生し、構文に問題があることを知らせます。(例:SyntaxError: invalid syntax)
  • KeyError: 辞書に存在しないキーを参照したときに発生します。(例:KeyError: "usb_ports")
  • ImportError: 存在しないパッケージや、パッケージ内に存在しない関数をインポートしようとしたときに発生します。

ここで挙げたのはほんの一部であり、Pythonでは他にも多くの種類の例外が存在します。

例外を発生させる方法(raise)

コード内で独自のカスタム例外を定義することもできます。Pythonが提供する組み込み例外だけではプログラムの要件を満たせない場合に便利です。

ここでは、ゲームのパスワードを検証するプログラムを作成してみましょう。まず、ユーザーにパスワードの入力を求めます。

password = input("Enter a password: ")

パスワードが有効であるためには、12文字より長くなければなりません。12文字以下の場合は、例外を発生させたいところです。

そこで、if文を使って、ユーザーが入力したパスワードが12文字未満かどうかをチェックします。

if len(password) > 12:
	print("Your password is valid.")
else:
	raise Exception("Your password is not the correct length.")

len() メソッドでパスワードの長さを計算し、無効なパスワードが入力された場合は、「Your password is not the correct length.」というメッセージとともに例外を発生させます。

実際にコードを実行して動作を確認してみましょう。

Enter a password: Bacon120
Traceback (most recent call last):
  File "main.py", line 6, in <module>
	raise Exception("Your password is not the correct length.")
Exception: Your password is not the correct length.

入力されたパスワードは12文字未満だったため、無効なパスワードとしてプログラムが停止しました。今度は有効なパスワードで実行してみます。

Enter a password: Bacon120Bacon120
Your password is valid.

今度はプログラムが正常に実行されました。

例外を処理する方法(try...except)

デフォルトでは、例外が発生するとプログラムの実行は停止します。エラーの解決を強制できるという点で有用ですが、状況によっては、例外が発生してもプログラムを止めたくないケースもあります。

たとえば、リスト内のデータが有効かどうかをチェックする場合、無効なデータが見つかるたびに例外でプログラムが中断されては困るでしょう。

例外を処理するには、「try...except」ブロックを使用します。ここでは、辞書から項目を検索するプログラムを作成してみましょう。この辞書には、クラスの生徒名と直近のテストの点数が格納されています。

まず、生徒名と点数の情報を持つ辞書を定義します。

data = {
	"Lucy": 73,
	"Carlton": 59,
	"Adam": 73
}

次に、点数を取得したい生徒の名前をユーザーに入力してもらいます。後ほど例外を処理できるよう、この処理は「try」ブロック内に記述します。

try:
	student = input("Enter the name of the student whose grade you want to retrieve: ")
	print(data[student])

このコードは、ユーザーが入力した名前に一致する生徒の点数を出力します。しかし、存在しない名前が入力された場合には KeyError が発生します。

これに対応するため、exceptブロックを追加しましょう。

try:
	student = input("Enter the name of the student whose grade you want to retrieve: ")
	print(data[student])
except:
	print("This student is not present in the list of grades.")

該当する生徒が見つからない場合、except節が実行されます。プログラムを実行してみましょう。

Enter the name of the student whose grade you want to retrieve: Lucy
73

有効な生徒名を入力した場合は、正しく動作します。次に、存在しない生徒名を入力してみます。

Enter the name of the student whose grade you want to retrieve: Kaitlin
This student is not present in the list of grades.

例外は発生しましたが、プログラムは停止しませんでした。代わりに「except」ブロックの中身が実行されています。

try...exceptブロックについてさらに詳しく知りたい方は、Pythonのtry...exceptに関するガイドもあわせてご覧ください。

まとめ

例外は、コードに論理エラーが存在することを教えてくれる仕組みです。例外が発生した際には、例外の種類、発生した場所、そしてエラーメッセージを確認しましょう。これらの情報をもとに、例外の原因を特定できます。

また、raise 文を使えば独自の例外を発生させることもでき、try...except ブロックを使えば例外を適切に処理することも可能です。

これで、あなたもPythonの例外をプロのように扱えるようになりました!

  1. Rubyの例外処理入門!初心者向けに基礎からわかりやすく解説

    先日、Rubyの基本構文は理解しているものの、「例外とは何か」「なぜ便利なのか」がいまひとつピンとこない初心者向けの例外解説記事を探していました。しかし見つからなかったため、自分で書いてみることにしました。この記事が皆さんのお役に立てば幸いです。分かりにくい点があれば、@StarrHorneまでツイートでご連絡ください。 例外(Exception)とは何か? 例外とは、Rubyが予期しない出来事に対処するための仕組みです。 コードにタイプミスがあり、SyntaxErrorやNoMethodErrorといったメッセージとともにプログラムがクラッシュした経験はありませんか?それが例外の動作を

  2. Rubyの例外処理入門:raiseとrescueの基本をマスターしよう

    例外(Exception)とは、アプリケーションで発生した例外的な状況に関する情報を保持する特殊なデータ構造です。プログラムが特定の状況への対処方法を判断できず、実行を継続できないときに送られるシグナルが例外です。Rubyでは、このようなシグナルを送ることを「例外を発生させる(raise)」と呼びます。 raise これは例外です puts このメッセージは表示されません。 例外の動作を最も手軽に確認する方法は、自分で例外を発生させてみることです。raiseメソッドにメッセージを渡して呼び出すと、Rubyはそのテキストを説明文として持つRuntimeErrorを生成します。同時に、コード内