プログラムを安全に実行できるようにする上で欠かせないのがエラー対策です。
どれほどコードの記述時に気を付けていても意図しないエラーは発生しうるものなので、実際にエラーが起きた際に想定外の動作を防ぐための例外処理が必要となります。
Pythonでは、try-except文を使用することで例外処理が実行できるようになります。
今回は、Pythonで try-except文を使用する方法について、詳しく解説していきたいと思います。
プログラムのエラーと例外処理とは?
プログラミングをする上で、一度もエラーに遭遇したことがないという人はいないでしょう。
どれだけ技術が豊富な人でも、必ず何かしらのエラーが発生することはあります。
エラーは主に、以下の2つのケースで発生します。
- 構文に何かしらのミスが含まれている(構文エラー)
- 想定しない値が代入されたり、意図されていない方法で処理が実行される(例外)
こうしたエラーが発生した際に、安全に処理を継続、もしくは終了するために実行されるのが「例外処理」です。
Pythonでは、try-except文を使用して例外処理を実装することができます。
構文エラー(Syntax Error)とは?
構文エラー (SyntaxError) は、文法上の間違いがある場合に呼ばれるエラーです。
関数などの使用時に正しく括弧で括られていなかったり、あるいはスペルミスがあったりなど、Pythonで定められている文法に沿わないコードがある際にこのエラーが発生します。
【サンプルコード】
print 'Hello'【実行結果】
SyntaxError: Missing parentheses in call to 'print'.上記の例では、pritn関数の実行時に引数を括弧で囲わなかったためにエラーが発生しています。
引数内で括弧が入れ子状態になっている時など、コードが複雑化した場合に見落としが起こりやすくなるため、よく見られるエラーの1つです。
例外(Exception)とは?
想定しないデータ型の値が変数や引数に代入されたり、許容範囲にない値を参照しようとしてしまうなど、コードを実行する上で起こりうるエラーのことを例外と呼びます。
例えば、以下のようなケースが該当します。
【サンプルコード】
x = 10 / 'sample'
print(x)【実行結果】
TypeError: unsupported operand type(s) for /: 'int' and 'str'上記は、例外の1つである TypeErrorのケースです。
TypeErrorは、型に関するエラーを指すもので、上記の場合は計算できない型同士で演算を行おうとしたためにエラーが発生しています。
try-exceptの使い方
上述したようなエラーが発生した際に、例外処理を実行させるために使用するのが try-except 文です。
まずは、基本的な使い方から順に確認していきましょう。
基本構文
try-except文を使用する際の基本構文は、以下のように記述します。
【基本構文】
try:
エラーをキャッチしたい処理内容
except エラーの種類:
例外発生時に行う処理エラーが発生した場合にキャッチしたい処理内容を try節のブロック内に記述し、実際にエラーが発生した場合に実行する処理内容を except節のブロック内に記述します。
正常に処理が完了した場合は except節の処理はスルーされ、エラーが発生した場合にはその段階で try節の処理は中断され、except節に処理が移ります。
また、except節にはキャッチしたいエラーの種類を記述します。
ここに記述した種類のエラーがキャッチ対象となります。
指定可能なエラーの種類には、以下のようなものがあります。
- AttributeError
- TypeError
- ValueError
- ZeroDivisionError
- IndexError
- KeyError
- importError
- FileNotFoundError
- FileExistsError
実際の使用例を見てみましょう。
【サンプルコード】
try:
z = 10 / 0
except ZeroDivisionError:
print('ZeroDivisionError')
print('Hello world!')【実行結果】
ZeroDivisionError
Hello world!値を0で割った場合に起こる ZeroDivisionErrorをキャッチし、例外処理が実行されました。
エラー回避がされたことにより、プログラムも停止することなく次に処理が移行されています。
一方で、キャッチ対象に異なる種類のエラーを指定した場合は、例外処理が正常に実行されません。
【サンプルコード】
try:
z = 10 / 0
except TypeError:
print('TypeError')
print('Hello world!')【実行結果】
ZeroDivisionError: division by zero例外処理を実装する際は、対象の処理によって起こりうるエラーが何であるかを正確に把握する必要があります。
例外が発生した後の処理の書き方
try-except文では、例外の有無や種類によって動作を振り分けることもできます。
それぞれの方法について見ていきましょう。
raiseとpassの使い方
Pythonでは、raise句を使用することで、意図的に例外を発生させることもできます。
以下の例を見てみましょう。
【サンプルコード】
try:
val = "sample"
if isinstance(val, str):
raise TypeError
print(val)
except TypeError:
print('TypeError')【実行結果】
TypeError上記の例では、valの値が文字列だった場合に raise句で例外を発生させるようにしています。
実行結果を見てみると、valに代入した値が文字列のため例外処理が実行されているのが分かりますね。
このように、特定の条件下において意図的に例外を発生させたい場合に、raiseを使用します。
また、エラー回避だけ行い、例外処理は何も実行せずに次の処理に移らせたい場合には、pass句を使用します。
【サンプルコード】
try:
x = 10 / 0
print(x)
except ZeroDivisionError:
passexcept節のブロック内に何も記述せずいると IndentationErrorが発生してしまうため、例外処理が必要ない場合はこのように pass句を記述するようにしましょう。
elseとfinallyの使い方
try-except文では、任意で else節と finally節を使用することができます。
else節は、特定の処理を正常に実行できた場合行う処理を、明示的に記述したい場合に使用できるブロックです。
結果としては、エラーが発生しなかった場合に try節のブロック内の処理が全て実行されるのに変わりはありませんが、記述を分けることで視覚的に処理を把握しやすくなるメリットがあります。
else節が記述されている場合、エラー発生時には else節の処理は実行されません。
【サンプルコード】
def division(a, b):
try:
print(a / b)
except ZeroDivisionError as error:
print(error)
else:
print('finish')
division(4, 2)
division(4, 0)【実行結果】
2.0
finish
division by zero一方、エラーの有無に関わらず必ず実行させたい処理がある場合に使用できるのが、finally節です。
【サンプルコード】
def division(a, b):
try:
print(a / b)
except ZeroDivisionError as error:
print(error)
else:
print('正常に処理しました')
finally:
print('実行完了です')
division(4, 2)
division(4, 0)【実行結果】
2.0
正常に処理しました
実行完了です
division by zero
実行完了です処理内容が正常に完了したかどうかに関係なく、finally節の処理が実行されているのが分かりますね。
このように、動作の必要性に合わせてブロックを使い分けることができます。
例外が複数発生する場合
ここまで紹介した例では、1種類の例外のみを対象にしてきましたが、キャッチするエラーの種類は複数指定することもできます。
以下の例を見てみましょう。
【サンプルコード】
def division(a, b):
try:
print(a / b)
except ZeroDivisionError as error:
print(error)
except TypeError as error:
print(error)
division(2, 'sample')
division(2, 0)【実行結果】
unsupported operand type(s) for /: 'int' and 'str'
division by zero起こりうる例外を複数指定することで、値ごとに発生するケースが異なっていても正常にエラー回避できるようになっています。
このように、1つの try-except文の中で、複数の例外に対応することができます。
ただし、1つ注意するべきポイントとして、キャッチ対象とする例外が複数指定されていても、エラー発生時に実行される例外処理はいずれか1つのみとなります。
try節内で異なる例外が複数発生する場合に、先に発生した種類の例外処理のみが実行され、それ以降の処理はブロックを抜けて中断されてしまうので、処理内容の記述順には注意が必要です。
まとめ
今回は、Pythonで try-except文を使用する方法について解説しました。
エラー回避を正常に行う上では、構文の使い方やエラーの種類だけでなく、対象の処理によって起こりうる結果を正確に予想する必要があります。
コード1つ1つの内容をしっかりと理解して、正しく対処できるよう練習していきましょう。
Pythonの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、Pythonに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。