例外処理

ゆうき( @BASEBALLY15 )です^^

すみません・・・
例外処理』の使い方について基本的な内容を教えてください・・・

分かりました!

お願いします・・・

例外処理とは?

今まで,Pythonの学習をしてきて,このようなエラーが出たことはないですか?

ValueError: invalid literal for int() with base 10: 'a'

・ZeroDivisionError: division by zero

これらのエラーが出ると,そこで実行が停止してしまいますよね・・・

そこで,今回紹介する『例外処理』を使うと,実行を停止せずに作業を続けることが出来ます.

それでは,コードを見ていきましょう⤵

例外処理(try,except)についてまとめました!

例外処理を使わずに100÷0を計算してみよう!

まずは,例外処理を使わない場合のコードを書きます.

a = int(input("分子の値="))

b = int(input("分母の値="))

number = a / b

print("頑張りましょう!")

print(f"計算結果 = {number}")

これを実行すると,このような画面が表示されます.

例外処理(try,except)

分子の値を100とし,分母の値を0とすると,

分母に0を置くことは出来ないので,このようなエラーが出ます.

---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-1-41e4b5c1624d> in <module>
      3 b = int(input("分母の値="))
      4 
----> 5 number = a / b
      6 
      7 print("頑張りましょう!")

ZeroDivisionError: division by zero

ここでエラーが出てしまうと,

print(“頑張りましょう!”)

print(f”計算結果 = {number}”)

が実行されず,作業が途中で止まってしまいます.

しかし,『例外処理』を使うと,これらの結果を表示させることが出来ます.

それでは,『例外処理』を使ったコードを見てみましょう⤵

例外処理の形はこのようになります!(本題)

例外処理』を使うときは,このようなまとまりで書きます.

try:
    
    実行したい処理
  
#eは短縮した形
except エラー名 as e:
    
    エラーが発生した時に行う処理
    
finally:
    
    例外処理の後に実行する処理

この形をもとに,例外処理を使って,上で紹介した計算をしてみます⤵

例外処理を使って,100÷0を計算してみよう!(本題)

それでは,例外処理を使って,100÷0を計算してみたいと思います.

try:
    
    a = int(input("分子の値="))

    b = int(input("分母の値="))

    number = a / b

    print(f"a ÷ b = {number}")
    
except ZeroDivisionError as e:
    
    print(e)
    
    print("分母に0を入れることが出来ません!")
    
finally:
     print("頑張りましょう!")

これを実行するとこのように表示されます.

例外処理(try,except)
分子の値=100
分母の値=0
division by zero
分母に0を入れることが出来ません!
頑張りましょう!

上で紹介した結果と違って,エラーが出た後に,

print(“頑張りましょう!”)

が実行されていることが分かります.

このように,『例外処理』を使うと,実行を続けることが出来るのです!

raiseを使って,強制的に例外処理を行おう!(本題)

raise』を使うと,強制的に例外処理を行うことが出来ます.

try:
    
    #強制的に例外処理を行う
    raise Exception
    
    a = int(input("分子の値="))

    b = int(input("分母の値="))

    number = a / b

    print(f"a ÷ b = {number}")
    
except ZeroDivisionError as e:
    
    print(e)
    
    print("分母に0を入れることが出来ません!")
    
except Exception as e:
       
    print("強制的にエラーが実行されました!")
    
finally:
     print("頑張りましょう!")
実行結果
強制的にエラーが実行されました!
頑張りましょう!

このように,

    raise Exception

と書くと,強制的に以下の『Exception』という例外処理を行います.

except Exception as e:
    
    print(e)
    
    print("強制的にエラーが実行されました!")

ちなみに,

Exception』という例外処理は,スーパークラスと言われ,

どのようなエラーが出るか分からないときに使うことが出来ます.

100÷0は,ZeroDivisionErrorというエラーが出ることが分かりますが,

中には何のエラーが出るか分からないときもありますよね^^

そんな時に,『Exception』を使うことが出来ます.

関数として例外処理を使ってみよう!(本題)

例外処理』は,関数の中で実行することも出来ます.

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

calculation関数を作り,引数にabを使います.

def calculation(a, b):
    
    try:

        number = a / b

        print(f"a ÷ b = {number}")

    except ZeroDivisionError as e:

        print(e)

        print("分母に0を入れることが出来ません!")

    except ValueError as e:

        print(e)

        print("計算式には数字を入れてください!")

    finally:
         print("頑張りましょう!")

この関数を実行してみましょう⤵

#1つ目の引数に100,2つ目の引数に0を入れる
calculation(100, 0)
実行結果
division by zero
分母に0を入れることが出来ません!
頑張りましょう!

このように,関数内の処理を呼びだすことが出来ます.

おまけ

tracebackを使ってみよう!(本題)

今まで紹介してきた方法だと,

division by zero

のように,エラー名が表示されるだけでした.

しかし,『traceback』を使うことで,エラーの原因も表示することが出来ます.

それでは見てみましょう⤵

まずは,『traceback』をインポートします.

#tracebackをインポートする
import traceback

そして,『traceback』の『format_exc()』を使います.

try:

    a = int(input("分子の値="))

    b = int(input("分母の値="))

    number = a / b

    print(f"a ÷ b = {number}")
    
except ZeroDivisionError as e:
    
    #tracebackのformat_exc()を使う
    print(traceback.format_exc())
    
    print("分母に0を入れることが出来ません!")
    
finally:
     print("頑張りましょう!")

これを実行し,分母に0を入れると,このように表示されます.

例外処理(try,except)
分子の値=100
分母の値=0
Traceback (most recent call last):
  File "<ipython-input-22-8fb979400467>", line 12, in <module>
    number = a / b
ZeroDivisionError: division by zero

分母に0を入れることが出来ません!
頑張りましょう!

エラー名に加えて,エラーの原因も表示されていますね^^

実際にエラーとして表示してみよう!(本題)

例外処理』を使うと,実行結果エラーとしては表示されませんね.

そこで,『sys』というライブラリをインポートすると,

エラー画面に,エラーとして結果を表示させることが出来ます.

コードはこのように書きます.

#tracebackをインポートする
import traceback

import sys


try:

    a = 100

    b = 0

    number = a / b

    print(f"a ÷ b = {number}")
    
except ZeroDivisionError as e:
    
    print(traceback.format_exc())
    
    print("分母に0を入れることが出来ません!")
    
    sys.stderr.write(traceback.format_exc())

finally:
     print("頑張りましょう!")

sys.stderr.write()

で,エラー画面にエラー結果を表示させることが出来ます.

これを実行すると,このように表示されます.

分子の値=100
分母の値=0
Traceback (most recent call last):
  File "<ipython-input-23-e9d3b07422c0>", line 14, in <module>
    number = a / b
ZeroDivisionError: division by zero

分母に0を入れることが出来ません!
頑張りましょう!

Traceback (most recent call last): File “<ipython-input-23-e9d3b07422c0>”, line 14, in <module> number = a / b ZeroDivisionError: division by zero

赤で囲まれた部分が,エラー画面で表示されている結果になります.

これで,エラーの原因が何なのかをすぐに見つけることが出来ますね^^

終わりに

今回は,『例外処理』についてまとめました.

エラーの種類によっては,無視して次の実行に移りたい時もあると思います.

そんな時に,今回紹介した方法を使ってみてください^^

それでは・・・

Q &A

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA