Python

Python – ⑦ try文(例外処理)

try文

 try文は『例外処理』に使われます。例外処理とは、プログラムを実行している最中にエラーが発生したら行われるエラーへの対処のことです。

 

 Pythonではプログラムを実行しようとすると、タイプミスや予想外の事態などで様々なエラーが発生します。

 

>>> 11/0
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
11/0
ZeroDivisionError: division by zero        #①
>>> print(x)
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
print(x)
NameError: name 'x' is not defined      #②
>>> print('a)
SyntaxError: EOL while scanning string literal        #③
>>> a='A'
>>> a.append('B')
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
a.append('B')
AttributeError: 'str' object has no attribute 'append'        #④
>>>

 

 間違ったプログラムを実行すると赤字で長文のエラーが表示されます。どこでエラーが発生したかの情報がゴチャゴチャ書いてあってわかりにくいですが、一番重要なのはエラー文の最後の一行です(①、②、③、④)。そこにどんな名前のエラーが発生したか書かれています。

 

 ①~④のエラーには次のような特徴があります。
 
 ①ZeroDivisionError
 数字を0で割ったときに発生
 
 ②NameError
 定義されていない変数が使われたときに発生
 
 ③SyntaxError
 構文の形式に誤りがあるときに発生
 
 ④AttributeError
 使ってはいけない場面で特定のメソッド(命令)を使用したときに発生
 
 具体的に②では定義(値を代入)していない変数『x』を『print()』関数で出力しようとしているのでエラーが発生しました。

 

②のエラー
>>> print(x)
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
print(x)
NameError: name 'x' is not defined      #②

 

 ③のエラーは『 ‘ 』(クオーテーション)を片方付け忘れたためです。

 

③のエラー
>>> print('a)
SyntaxError: EOL while scanning string literal        #③

 

 ④はリストだけに使ういわばリスト専用の『append()』メソッドを文字列である変数『a』に対して用いてしまったためにエラーが出ています。リストと文字列は根本的に違うものです。

 

④のエラー
>>> a='A'
>>> a.append('B')
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
a.append('B')
AttributeError: 'str' object has no attribute 'append'        #④

 

 ここで紹介したエラーはほんの一部に過ぎず、もっとたくさんの種類があります。

 

 前置きが長くなってしまいました。これらのエラーが発生したときに、あらかじめどんな対処をするかを書くのがtry文です。

 

書式
>>> try:
□□□□エラーが発生するかもしれない処理
except エラー名:
□□□□対処

 

 まずは『try:』に続けてエラーが発生する可能性のある処理を書きます。ここでも赤い□で表した部分のインデント(スペース)が4つ必要です。次に『except』とともに発生が予想されるエラー名を指定し、その下にその時の対処を書きます。『ZeroDivisionError』を使って実例を見てみましょう。

 

>>> try:
print(11/0)        #1⃣
except ZeroDivisionError:        #2⃣
print('数字を0では割れません')        #3⃣
 
'数字を0では割れません'
>>>

 

 『11/0』という処理を行おうとすると(1⃣)、『ZeroDivisionError』が発生しますが、あらかじめ『except』でそれが発生することを想定してあります(2⃣)。なので対処(3⃣)が実行されています。

 

 この例でもし『try』の次を『11/1』とすれば、『ZeroDivisionError』は発生しません。よって『print(‘数字を0で・・・’)』(3⃣)も実行されません。

 

 他にも『NameError』でやってみましょう。

 

>>> try:
print(x+3)
except NameError:
print('定義されていない変数が使用されました')        #4⃣
 
'定義されていない変数が使用されました'
>>>

 

 変数『x』はまだ定義されていないので『NameError』が発生し、それに対する処理(4⃣)を行っています。
なお、『except』の直後には起きることが予想されるエラーの名前を書くと説明しましたが、どんな種類のエラーが出るかわからないときにはエラー名を省略するという手もあります。どんなエラーが出ても対処できるようになります。

 

 最後にtry文とif文を組み合わせてみましょう。

 

>>> x=9
>>> y=1
>>> z=0
>>> try:
if x%2==0:        #❶
x=x/y        #❷
else: #❸
x=x/z
except:
print('エラー発生')
 
'エラー発生'
>>>

 

 『try』以下に『x』が偶数の時(❶)には『x』を『y』で割ったものを再度『x』に代入(❷)し、それ例外の時=奇数の時(❸)には『x』を『z』で割ったものを『x』に入れ直しています。今回は『x』が9で奇数なので『x』を『z』で割りますが、『z』の値は0なので『ZeroDivisionError』発生です。

 

 これで基本構文は終わりです。次回からは『print()』などの関数の仕組みと、自分でオリジナルの関数を作る方法に入ります。もう怖いものなし!次に進んで頑張りましょう!