Re:ゼロから始める文系プログラマ

未経験がプログラミングを通して人生を変える

【Python・例外処理】~エラーの種類~


スポンサードリンク
 

f:id:ShotaNukumizu_1000:20210405111435p:plain

おはようございます!Shotaです。今日も早速、Pythonに関する記事を書いていきます。

今日は昨日に引き続き、「エラーの種類」について解説していきます。

 

【目次】

 

例外のエラーメッセージ

書き間違いによるエラー

 実行時に発生する例外のエラーメッセージについて解説していきます。まずは、初心者のうちによくやりがちな書き間違いです。

まずは次のようなコードで試してみましょう。

 

#書き間違いのあるプログラム
x = imput('整数を入力:')
res = x ** 2
print(res)

 

▼実行結果

Traceback (most recent call last):
  File "sample.py", line 2, in 
    x = imput('整数を入力:')
NameError: name 'imput' is not defined

 

コマンドで実行すると、実行した直後に上のようなエラーメッセージが発生します。先程までのエラーと異なるのは、「プログラムの実行後にエラーになる」という点です。

ここでは、sample.pyの2行目でエラーが発生しています。「NameError」は、「名前がプログラム上に見つからない」というエラーです。ここでは、inputをimputと下記間違えています。imputという関数が見つからなかったのでNameErrorが発生したのです。 

ただし、上述のような書き間違いは構文エラーではないので十分に注意して下さい。関数名は自分で定義して追加することができるからです。

 

演算時の例外

これもPythonに慣れないうちはよく発生する例外の一つでしょう。

 

#演算できないプログラム
x = input('整数を入力:')
res = x ** 2
print(res)

 

▼実行結果

整数を入力:2
Traceback (most recent call last):
  File "sample.py", line 3, in 
    res = x ** 2
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

 

例外のエラーは、最初に「Traceback」と表示されます。これは、エラーが発生した場所を、関数やメソッドなどの呼び出し順がわかるように表示するものです。

先程のプログラムでは、「TypeError」が発生しています。ここでは、入力された値を「res = x ** 2」というように演算しています。ところが、inputで入力した値はすべて文字列の値として出力されます。

このため、「x ** 2」は「文字列を2乗している」と判断されます。Pythonではこのような演算はできないので例外が発生したのです。

これも「実際に動かして初めて分かるエラー」なので例外の一つに数えられます。

 

呼び出しの場所とトレースバック

 例外のエラーメッセージは、時々非常にわかりにくいものになります。例外のメッセージが構文のエラーメッセージとは違うトレースバックと呼ばれる形になっているからです。

以下のコードで試してみましょう。 

 

#トレースバックを読み込むためのプログラム
def fn():
    fn1()

def fn1():
    fn2()

def fn2():
    fn3()

def fn3():
    print('a' * 'b')

fn()

 

▼実行結果

Traceback (most recent call last):
  File "sample.py", line 14, in 
    fn()
  File "sample.py", line 3, in fn
    fn1()
  File "sample.py", line 6, in fn1
    fn2()
  File "sample.py", line 9, in fn2
    fn3()
  File "sample.py", line 12, in fn3
    print('a' * 'b')
TypeError: can't multiply sequence by non-int of type 'str'

 

何行も「File…」という文が続いていますが、これはErrorが発生したのがどこから呼び出されたかを表示しています。

このプログラムは、14行目にあるfn()が実行された際にエラーが発生しています。fn関数を定義し、fn1関数を呼び出し、fn1ではfn2関数を呼び出しています。更にfn2関数ではfn3関数を呼び出していて、このfn3関数のprint分を実行する際に「TypeError」が発生しています。

ここでは、各関数内で他の関数を呼び出すという単純な処理を行っていますが、本格的なプログラムになるとそれぞれの関数の中で複雑な処理を行うことになります。ただ「エラーが発生した」だけではなく、「エラーが発生した関数やメソッドは、どこから呼び出されたか」も重要になります。

 

まとめ

【本日のまとめ】

  • プログラムを実行したとき、関数などの名前が見つからない場合は「NameError」という例外が発生する
  • 「Traceback」は、エラーが発生した関数やメソッドの呼び出し元をたどって表示する
  • エラーの内容を知るためには、「エラーが発生した」だけではなく「エラーが発生した関数やメソッドが呼び出された場所」も同様に大切

 

本ブログでは、こんな感じでPythonにまつわる情報や基本的な知識、Pythonの操作方法やニュースをたくさん紹介していきます。毎週日曜日に、普段とは趣向を変えて有名な自己啓発本・ビジネス書を要約・考察するブログを書いていきます。

この記事がいいと思った人はSNSにシェアしてくれると非常に嬉しいです!

明日は日曜日なので、書籍の要約をやっていきます。解説する書籍は『時間術大全』です。

今日も最後まで読んでくださりありがとうございました!

 

【参考図書】

gihyo.jp