tryとexceptを使ってエラーをコントロールする


エラー処理

今回はエラー処理の解説です、エラーは大別して2種類あります、

・構文エラー
・例外エラー
 ですね!

構文エラーはPython言語の文法違反のエラーであり、
実行が不可能なものです、行の最後のコロンを忘れたり、
インデントが正しくない場合に発生してすぐに止まります。


実行時のエラーは例外エラーとよばれ、tryとexceptで構成されて、
エラー発生後処理を制御できます、だからエラーを無くす事もできます。

try exceptの書き方


try: 
    処理1
    処理2
    ~
    
except エラー名:
    エラー発生時の処理

スクリプトの説明

スクリプトは、入力された数字で割り算を行うというものですが、
エラーをつかまえてエラー処理をおこないます。


エラーは、0割りのエラー、数字以外のエラー、
その他エラーをprint文で表示しています。

つかまえるには、

except ZeroDivisionError
eexcept ValueError
eexcept Exception as e

を使います、最後のException as eの「e」変数にはエラー情報が入っています、
文字列型ではないので注意して下さい。
(文字列型にするには、str(e)のように文字列型にキャストします)

try:
    num = input("数字を入力して下さい")
    
    intData = int( num )    # 整数に変換
    data = 100 / intData    #  割り算します 
    print("結果",data)

except ZeroDivisionError:
    print("0で割ることはできません")
    
except ValueError:
    print("値のチェックが必要です(数字でない)")

except Exception as e:
    print("その他のエラー", e)

スクリプトを詳しく見てみましょう! 「数字を入力して下さい」を表示して入力要求します、
 整数に変換、
 100で割る、
 最後に結果を表示します。

これらの処理は、tryのブロック内にある事に注意しましょう。

*最初は正常ケースの動作を見てみましょう!
PyCatで[実行]をクリックします、
入力要求まできたら、好きな数字を入力しましょう、
エラーが発生しないで、割り算の結果が表示されます。


*ケース1~3までを実行して確認、エラーの発生を確認してみて下さい。
PyCatで[実行]をクリックします、
入力のプロンプト「数字を入力して下さい」が表示されたら、入力する

ケース1 文字を入力(数字以外)
ケース2 数字の0を入力

エラーで停止したら、[次へ]をクリックしてステップ実行させて、
流れを確認しましょう!

ケース3は、編集が必要になります。

ケース1
    「abc」を入力してEnterすると
    エラーが発生します、数字でないので変換できないエラー。
    
    ValueError: invalid literal for int() with base 10: ''
    
    スクリプトの流れでは、
    
        except ValueError:
            print("値のチェックが必要です(数字でない)")
    
    でエラー停止します(このツールではわかりやすくする為に停止する)。
    再実行して流れを確認してみて下さい。
ケース2
    入力で「0」を入力する、
    「ZeroDivisionError」のエラーが発生します。

    スクリプトの流れでは、
        except ZeroDivisionError:
            print("0で割ることはできません")

    でエラー停止します(このツールではわかりやすくする為に停止する)。
    再実行して流れを確認してみて下さい。
ケース3
    作業モード:編集中にして、以下のように修正
            num = input()
            ↓
            num2= input()
    
    NameError: name 'num' is not defined
    のエラーが発生する
    
    以下に流れてメッセージを表示する
    except Exception as e:
        print("その他のエラー", e)
        
    ※メッセージ
        その他のエラー name 'num' is not defined

ポイント

・エラー監視は、tryのブロックの間が対象になります
・exceptの後にエラー名(エラーブロックが処理される)
・exceptは複数書ける
・except Exceptionはすべてのエラーの取得可能

以下の行を追加して流れを確認しよう
else
finally
はどう流れるのか?

except Exception as e:
    print("その他のエラー", e)

else:
    print("正常終了")
    
finally:
    print("最後はここに来ます")
elseブロックは、は正常時に処理される finallyブロックはすべてのブロック終了後に処理される

※エラー発生箇所が赤ラインになりプログラムが停止します、しかし例外エラーは再実行できます。



 再実行は[実行]を再度クリックします。

 ステップ実行は[次へ]をクリックしますが、
 コードパネル上でマウスクリックか[Enter]でも可能です。