tryとは?
Pythonのtry文は、例外が発生する可能性のある処理を記述し、例外処理を指定するための構文です。
例えば、0で割り算をしたり、存在しないファイルを開こうとしたりすると、プログラムが強制終了する場合があります。実務では、予期せぬ処理の中断や、利用者にとって難解なエラー表示が出るのは好ましくありません。
このような場面に対応するために重要なのが、 try文です。
try文でエラーに備える
tryブロックには、例外が発生する可能性のある処理を記述します。そして、例外が発生した場合の対応をexceptブロックに記述することで、状況に応じた処理を行えるようになります。
例えば、具体的なエラーメッセージを表示したり、別の方法で処理を続けたりできます。実務では、ユーザーが数字の入力欄に文字列を入力した場合、エラーで終了させずに入力のやり直しを求めることも一般的です。
この仕組みは例外処理と呼ばれています。try文を用いた例外処理は、予期しない状況に対応し、プログラムを安定して動作させるために役立ちます。
【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング
tryの基本構文
tryの基本構文は、tryとexceptの2つを組み合わせて書きます。tryの後ろにコロン(:)を付け、インデントを4スペース下げて、エラーが起こるかもしれない処理を書きます。続いてexceptの後ろに例外の種類を指定し、その例外が起きたときの処理を同じようにインデントして書きます。
まずは、最もよく使う形から見ていきましょう。次のコードは、10を0で割ろうとして ZeroDivisionError が発生する例です。この例外をexceptで捕捉し、メッセージを表示します。
出力結果
0では割り算できませんこのように、exceptで捕捉する例外に対応した処理を記述することで、メッセージ表示などの処理を実行できます。
else節とfinally節を組み合わせる
次は、tryとexceptに加えて、else節とfinally節を使う書き方です。else節は例外が起きなかったときに、finally節は例外の有無にかかわらずtry 文を抜ける際に実行されます。
出力結果
変換できました: 12
処理を終了しますこの例では整数への変換が成功するため、except節は実行されず、else節とfinally節が順番に実行されます。
例外の内容を取得する
最後に、except節にasを付けて、発生した例外の内容を変数として受け取る方法です。エラーの原因を調べたいときに役立ちます。
出力結果
エラー内容: invalid literal for int() with base 10: 'ネコ'実用例
ここからは、tryを実際のプログラムでどのように使うのかを、8つのサンプルコードで紹介します。各サンプルは短くまとめており、コードの概要と詳しい説明、さらに出力結果を順に掲載しています。初めての方でも、実行したときの動きを一つずつ確認しながら読み進められます。
取り上げる例外は、ValueError、ZeroDivisionError、IndexError、KeyError、FileNotFoundError、TypeError などです。値の変換や計算、リスト・辞書の操作の場面でよく見かけるエラーです。それぞれの発生条件を知っておくと、適切なエラーの分析・対処に役立ちます。後半では、関数の中での使い方や、raise文で例外を自分で発生させる方法も取り上げます。
文字列を整数に変換できないときの処理
int()は、整数として解釈できない形式の文字列を渡すと、ValueErrorを発生させます。 ここでは、年齢を表す文字列を変換する例を見ていきます。
出力結果
年齢を整数に変換できませんでしたage_text には、「3歳」という文字列が含まれています。そのため int() は変換に失敗し、ValueError が発生します。exceptでこの例外を捕捉し、指定したメッセージを表示しています。
実際のプログラムでも、ユーザーの入力値や外部ファイルから読み込んだ値が、想定外の形式で届くことがあります。そのような場面では、変換処理をtryで囲むことで、想定外の処理の中断に対応できます。
0で割り算をしたときの処理
割り算の分母が0になると、ZeroDivisionError が発生します。ここでは、えさの量をネコの数で割る場面を例に挙げます。
出力結果
ネコの数が0匹のため計算できませんcat_count が0なので、計算式は100を0で割る形になり、ZeroDivisionError が発生します。例外が起きた時点でtryブロックの残りは実行されず、exceptブロックへ移ります。そのため、直後の print(per_cat) は実行されません。分母が入力値や集計結果で決まる場合、0になる場合があります。このような計算では、tryとexceptを使って例外に対処することで、0除算による例外でプログラムが終了するのを防げます。
リストの範囲外を指定したときの処理
リストに存在しない位置を指定すると、IndexError が発生します。ここでは、3匹分のデータしかないリストから、6番目の要素を取り出そうとする例です。
出力結果
指定した位置にデータがありませんanimals には3つの要素しかなく、指定できるインデックスは0から2までです。そこに5を指定したため、IndexError が発生します。Pythonのリストは、先頭の要素を0番目と数える点に注意してください。インデックスを計算で求める場合や、データの件数が実行のたびに変わる場合は、範囲外の指定が起こりやすくなります。tryで受け止めておけば、メッセージを表示して処理を続けられます。
辞書にないキーを指定したときの処理
辞書から[]を使って値を取得するとき、指定したキーが存在しない場合はKeyErrorが発生します。ここでは、動物園にいる動物の数を管理する辞書を使った例を見ていきます。
出力結果
ゾウのデータは登録されていませんzoo には、ライオンとキリンのデータしか入っていません。そこにゾウというキーを指定すると、該当するキーが存在しないため、KeyError が発生します。辞書は、キーを手がかりに値を取り出すしくみです。キーが存在しない場合は、値を返さずに例外で知らせます。外部から受け取ったデータを辞書として扱うときは、想定したキーが含まれていないことも考えられます。tryとexceptを使って例外に対処することで、データが不足している状況に対応できます。
存在しないファイルを開くときの処理
ファイルを開くときは、指定した名前のファイルが存在しない場合に FileNotFoundError が発生します。
この例では、プログラムの実行時に使用されるカレントディレクトリに animals.txt が存在しない場合を想定しています。ファイルが存在する場合は、その内容が表示されます。
出力結果
ファイルが見つかりませんこの出力結果は、animals.txtが存在しない場合のものです。open(ファイルを開く関数 ) がファイルを見つけられないため、FileNotFoundError が発生し、exceptブロックの処理が実行されます。ファイルが存在する場合は、取得したファイルの内容が表示されます。ファイル操作は、名前の書き間違いや保存場所の違いなど、プログラムの外側の事情で失敗することが少なくありません。そのため、tryで備えておく代表的な場面のひとつです。
複数の例外をまとめて処理する方法
異なる種類の例外に同じ対応をしたいときは、exceptの後ろにタプルで例外の種類を並べます。ここでは、リストの値を順番に整数へ変換する例を見ていきます。
出力結果
10
変換できない値です: abc
変換できない値です: Nonevalues には、文字列の10とabc、そして None (値が存在しないことを表す)が入っています。int("10") は成功しますが、int("abc") は ValueError、int(None) は TypeError を発生させます。exceptの後ろに複数の例外をタプルで指定すると、いずれかの例外が発生した場合に、同じ処理を実行できます。
また、for文の中でtryを使っているため、途中で失敗しても例外が捕捉されれば、次の要素の処理へ進みます。
関数の中で例外を処理して値を返す方法
関数の中で例外を処理すると、呼び出し元で例外を捕捉する代わりに、戻り値を使って処理結果を判断できます。ここでは、割り算の結果を返し、0で割る場合はNoneを返す関数を作ります。
出力結果
5.0
Noneget_ratio() は、2つの数を受け取って割り算の結果を返す関数です。1回目の呼び出しでは例外が起きないため、5.0が返されます。2回目の呼び出しでは ZeroDivisionError が発生し、exceptブロックで None が返されます。
このように関数の内部で例外を処理すると、呼び出す側のコードが読みやすくなります。ただし、None が返る可能性があるため、呼び出し元ではその場合の処理も考慮する必要があります。
raiseで例外を自分で発生させる方法
例外は、Pythonが自動で発生させるだけでなく、raise文を使って明示的に発生させることもできます。ここでは、体重が0以下の値だった場合にエラーとする関数を作ります。
出力結果
体重は0より大きくしてくださいcheck_weight() は、受け取った値が0以下のときに ValueError を発生させます。例外として表示するメッセージは、raise文の括弧の中に文字列で指定します。呼び出し側ではtryを使って check_weight(-3) を実行し、発生した例外を error という名前で受け取ります。print(error) を実行すると、指定したメッセージが表示されます。パンダなどの体重を記録するプログラムで、入力ミスを早めに見つける場面で役立ちます。
まとめ
Pythonのtryは、プログラムの実行中に発生する例外に対処するための構文です。基本はtryとexceptの組み合わせで、必要に応じてelse節やfinally節を加えます。例外の種類を指定して書く習慣をつけると、想定外の不具合にも気づきやすくなります。まずはこの記事のコード例を手元で動かし、出力結果を確かめてみてください。
tryの活躍する場面
- ユーザーが入力した文字列を数値に変換し、不正な値を受け止める場面
- ファイルなど外部のデータを読み込み、失敗に備える場面
- 計算やデータ取得の途中で起きる例外に対処し、必要な処理を続ける場面
重要なポイント
- 例外の種類を具体的に指定し、想定した例外だけを受け止めること
- 後始末が必要な処理では、finally節やwith文を適切に使うこと
- 例外を握りつぶさず、原因が分かるメッセージを残すこと
try文は、例外を処理するための基礎となる文法です。まずは各コード例を実行し、例外が発生する条件や処理の流れを確認しましょう。例外の仕組みを理解すると、予期しないエラーにも適切に対処しやすくなります。