Skip to main content

エラーの対処

エラーの見かたについては、基礎講座のステージ3の最後で見ましたが、ここでは具体的なエラーの対処法についてみていきます。エラーの対処には主にtry文を使います。

下のコードを見てください。

a = float(input())
print(10 / a)

実際にコードを実行してみるとわかりますが、このコードでは「10」という整数を、ユーザーが実行画面で入力した任意の数字で割ることができます。input()関数については実践 1の「もっとやりたい人のために」にも出てきますが、Pythonの実行画面上でユーザーが入力したものを文字列に変換してPythonに渡す役割をはたす関数です。

今度はコードを実行して、実行画面に整数ではなく適当な文字を入力してみましょう。以下のようなエラーが表示されるはずです。

Traceback (most recent call last):
File "/tmp/sessions/36411cdee32cd47a/main.py", line 1, in <module>
a = float(input())
ValueError: could not convert string to float: 'asdf'

エラーの内容を読むと、エラーの種類は「ValueError」で、内容は「'asdf'を小数に変換できませんでした」と書かれています。

それでは、try文とexcept節を用いてユーザーが数字以外を入力した場合にはエラーではなく、実行画面に「入力した内容は数字ではないようです」と表示させるようにします。

try文は、「tryの中身を実行してみて、エラーが発生したらexceptを実行する」ことを指示します。書き方は、

try:
処理
except:
処理

です。では実際につかってみます。

try:
a = float(input())
print(10 / a)
except:
print('入力した内容は数字ではないようです')

これを実行して文字を入力すると「入力した内容は数字ではないようです」がprint()されますね。

ところで、今のコードで実行画面に「0」を入力した場合も、「0」は数字なのに「入力した内容は数字ではないようです」と表示されてしまいます。実はユーザーの入力が「0」の場合は先程の「ValueError」とは異なるエラーが発生しているのですが、exceptが1つしかないのですべてのエラーをこれで賄ってしまっている状態です。

except節は、

except エラー名:
処理

と書くことでエラーの種類ごとに異なる指示を与えることができます。

それでは、エラーの種類を指定するためにユーザーの入力が「0」の場合どのようなエラーが発生しているかを確認します。このページの最初に書かれたコードを実行し、「0」と入力してください。すると以下のエラーが発生するはずです。

Traceback (most recent call last):
File "/tmp/sessions/921d2a020cf886ff/main.py", line 2, in <module>
print(10 / a)
ZeroDivisionError: float division by zero

このことから、ユーザーの入力が「0」の場合「ZeroDivisionError」というエラーが発生することがわかりました。それでは先程書いたコードにおいて「ValueError」と「ZeroDivisionError」で異なるexceptの処理を与えましょう。

try:
a = float(input())
print(10 / a)
except ValueError:
print('入力した内容は数字ではないようです')
except ZeroDivisionError:
print('ゼロで割ってはいけません!')

ユーザーの入力が文字の場合と「0」の場合で異なる内容をprint()することができましたね。

ここでは「ValueError」と「ZeroDivisionError」のエラーを見ましたが、Pythonにはその他にも様々なエラーが存在します。try文で回避できるエラーはPython公式ドキュメントの組み込み例外に書かれています。