Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回のPythonの基本の解説は、エラーと例外処理を行うための文法、try(トライ)文の解説です。特に今回は、
の2点について、その基本をわかりやすく解説したいと思います。
Contents
Pythonのエラーには2種類あります。それは公式ドキュメントによると、構文エラー (syntax error、シンタックスエラー) と 例外 (exception、エクセプション)です。
エラーには (少なくとも) 二つのはっきり異なる種類があります。それは 構文エラー (syntax error) と 例外 (exception) です。
Python公式ドキュメント:エラーと例外
後者の例外には「エラー」という文字が使われていませんが、広い意味でPythonでは、例外もエラーのの1つになっています。
構文エラーとは、乱暴にいえば「記法上の形式的なミス」のことです。たとえば、
if x == 1
print('xは1です')
これを実行すると、次のエラーがでます。
SyntaxError: invalid syntax
シンタックスエラー(構文エラー)と出ていますね。
上の例では、「if x==1」のあとに、コロン「:」が抜けているのでエラーとなります。
こういった決められた形通りに書いていない場合に構文エラーが起こります。
次に例外とは、たとえば、
x=1
y='Tom'
x+y
これを実行すると、次の例外が発生します。上述のように例外もエラーの1種です。
TypeError: unsupported operand type(s) for +: 'int' and 'str'
ここでは整数の1という整数型のデータと、Tomという人名の文字列型を足してしまっているので、エラー(ここでは例外)が発生します。整数型と文字列は「+」演算子では直接計算できません。
そして「TypeError」というのが、発生した例外の種類・内容を示す情報です。TypeError以外にもいろいろあります。Type=型、ですので、ここは型エラーということですね。
上のプログラムは、見た目上は正しいのですが、実際に処理をしていく場面でミスがあり、エラーとなっています。
構文エラーはあくまで形式的な構文上のエラー(書くべきものが書かれていない、書いてはいけないものが書いてあるなど)ですが、例外は実質的なエラーという感じでしょうか。なかなか説明は難しいですね。
実はここで重要なことは、この例外の種類・内容を示す情報を使って(ここではTypeError)、エラーと例外処理というプログラムを作ることが可能です。そのときに使う構文が、try文(except節を含む)なのです。
では実際にtry文の使い方を見ていきましょう。
Pythonにはエラーと例外を処理すつための構文として、try(トライ)文というものが用意されています。
その基本的な考え方は次のようになります。
try:
処理
except エラーの種類・内容1: # except節1
例外処理1
except エラーの種類・内容2: # except節2
例外処理2
.....
このtry~exceptの処理の流れを説明すると、以下のようになります。
・まずtry節の処理が実行される
↓
・そこでエラーが発生する(発生しなければそこでプログラムは終わり)
↓
・except節1へ移動する
↓
・その発生したエラーが、キーワードexceptの横に書かれた「エラーの種類・内容1」と一致するかどうかがチェックされる。エラーの種類・内容とは、たとえば上述の説明で出てきたTypeErrorのことです。
↓
・一致すればそのexcept節の例外処理1が実行される。
・一致しなければ次のexcept節2へ移動し、その「エラーの種類・内容2」と一致するかどうかがチェックされる
↓
一致すれば例外処理2が実行される
ということです。
それではこれをふまえて、次のコード例を見てください。
while True:
try:
x = int(input("数字を入力:"))
"""下のbreak文がないとずっと「数字を入力」させるウインドウが出現し続ける=無限ループになる
"""
break
except ValueError:
print('エラー。もう一度')
まず上のコードの簡単な概説図として次の画像を見てください。
この画像が示すのは、まずwhile文の内容として①があり、それがtry文だということです。
そしてそのtry文は、次の2つの節によって構成されています。
まずwhile Trueについて説明しておきます。Trueというオブジェクトについては、少し前に「【Python解説】True/Falseと「if False:」の解説」という記事で解説をしましたので、そちらをご参照ください。
TrueというオブジェクトはもともとPythonで最初から組み込まれているオブジェクトで、Trueは真理判定値としてTrueを返します。
そして、while文は、
while 式:
処理
while後の式の「真理判定値がTrueである間」はずっと処理がループされます。
Trueオブジェクトの真理判定値はTrueなので、While文の中身であるtry文全体が繰り返し実行されます。
しかし、Trueオブジェクトの真理判定値はずっとTrueなので、これだと無限にループし続けます。
それをある場合で終了させるのが、コード例中のbreakです。このbreakを含めて、以下try文を見ていきましょう。
再びコード例をここに書いておきます。
while True:
try:
x = int(input("数字を入力:"))
"""下のbreak文がないとずっと「数字を入力」させるウインドウが出現し続ける=無限ループになる
"""
break
except ValueError:
print('エラー。もう一度')
また、上の項目「基本的なtry~exceptの使い方・処理の流れについて」を再び参照しておいてください。
まず、
x = int(input("数字を入力:"))
この部分で、数字入力ウインドウが登場します。ここで場合わけします。すなわち、入力ウインドウに正しく数字を入力した場合とそうでない場合です。
まずこの画像のように正しく数字を入力(半角英数でたとえば10とか)場合では、何も例外は発生しません。数字を入力しろと言われ、数字を入力するのですから当然です。エラーはでませんから。
この場合、try節は例外を発生させませんので、except節には移動しません。
この結果、while Trueによりtry節だけが無限ループになりそうですが、ここでさきほど言及したbreakが効いてきます。
breakは、それが書かれる場所でループを終了させます。
よって、正しく数字を入力すればそこでループ処理は終了します。
次に、この画像のように正しく数字を入力しなかった(たとえば「山田」と入力)場合は例外が発生します。そして例外にはいろいろな種類・内容がありました。今回発生するのはValueErrorという例外です。
try節で例外が発生したので、その時点でもうexcept節へ移動します。つまり、break文は飛ばされます。
そしてそのexcept節には「ValueError」という例外が設定されています。
今回発生した例外はまさにValueErrorでしたので、その設定と一致します。
そこで、そのexcept節の処理が実行されるわけです。「エラー、もう一度」と表示されます。
さらに続けてTomと入力しても同じように、「エラー、もう一度」と表示が出ます。
この画像で、「エラー、もう一度」が2度表示されている点に着目してください。
そして最後に10と入力すると、それは正しい入力ですので上述のように、try節とその中にあるbreakによって、While文全体から抜け出して一連の処理が終了します。
以上、少し長くなりましたがtry~exceptの使い方の解説でした。