プログラミング

【python初心者】try/exceptとif文との活用例

*本サイトはアフィリエイト広告を利用しています。

初心者の方で、作った自動化プログラムが頻繁にエラーで止まってしまい、困っているという方はおられると思います。

今回は、エラー停止の回避(スルー/無視)によく使われる「tryとexcept」において、相性の良いif文を組み合わせた活用例を紹介したいと思います。

これをマスターすると、条件分岐での不要なエラーを回避(スルー/無視)できるようになり、自動化プログラムが裏で止まっていたなどという事態を減らせることができます。

超簡単で使い勝手の良いコードを紹介したいと思います。

はじめに: 不要なエラー停止を回避!

「tryとexcept」を使うと、Pythonでの不要なエラー停止を回避できます。

「tryとexcept」の入門の超簡単コードは下記で紹介しています。あまり、分かっていない方は、まず、こちらを確認いただけると良いと思います。↓
【python】tryとexceptの超簡単な活用例(pass/print/traceback)【超簡単】

tryとexceptとif文の組み合わせ

例題

例えば、aとbの大小を比較するif文の簡単な構文で考えてみます。

a = 10
b = 5

 

if a>b:
    print(b/a)
else:
    print(-b/a)

 

——————-

出力: 0.5

a=10 , b=5のときは、a>bなので、「出力はb/a=0.5」となります。

もし、a=2.5 , b=5のときは、a=<bなので、「出力は-b/a=-2.0」となります。

例題で発生しうるエラーについて考える

先ほどの例題のif文は、条件分岐に抜け漏れがあり、入力値によってはエラーが発生してしまいます。

例えば、「a = 0」のときです。下記のようなエラーが発生します。

a = 0
b = 5

 

if a>b:
    print(b/a)
else:
    print(-b/a)

 

——————-

ZeroDivisionError: division by zero

a=0 , b=5のときは、a=<bなので、「出力は-b/a」を計算しようとしまいますが、a=0のため割り算できずに「ZeroDivisionError」が発生してしまいます。

その他には、「a = “文字”」のときがあります。下記のようなエラーが発生します。

a = “文字”
b = 5

 

if a>b:
    print(b/a)
else:
    print(-b/a)

 

——————-

TypeError: ‘>’ not supported between instances of ‘str’ and ‘int’

a=”文字” , b=5のときは、if文の条件分岐 a>bのところで、strとintの比較となってしまい、「TypeError」が発生してしまいます。

エラー停止しないような構文を考える(tryとexceptの活用例)

「ZeroDivisionError」と「TypeError」などのエラーが発生した場合に、プログラムが不用意に停止することを回避したいときの対応例について説明したいと思います。

まず、「ZeroDivisionError」ですが、これはif文の条件分岐が適切ではないです。例えば下記のように、条件分岐に抜け漏れがないようにするのが良いと思います。

a = 0
b = 5

 

if a>b:
    print(b/a)
elif a==0:
    print(0)
else:
    print(-b/a)

 

——————-

出力:0

a=0となる場合は、割り算エラーがでることが分かっていますので、elifで条件分岐をあらかじめ増やしておきます。

これで、どのような数字にも対応することができるようになると思います。


次に、「TypeError」ですが、数式のところに文字が代入されしまって、エラーが発生しているので、「tryとexcept」でエラー回避したいと思います。

「tryとexcept」を使わなくても、if文で、aとbの変数がintじゃない場合は計算をしないという条件分岐でも対応はできるとは思いますが、構文が複雑になるのと、予想できないパターンに対応できないので、「tryとexcept」を使う方が簡単で便利かと思います。

コードは下記のようになります。

a = “文字”
b = 5

 

try:
    if a>b:
        print(b/a)
    elif a==0:
        print(0)
    else:
        print(-b/a)
except:
    print(“try中にエラー発生しexcept処理”)

——————-

出力:try中にエラー発生しexcept処理

a=”文字” , b=5のとき、ifの条件式a>bのところで「TypeError」が発生します。

try中でのエラーなので、except処理へ移行します。

出力は、exceptの条件式にあるprintで、”try中にエラー発生しexcept処理”が表示されます。

try中に発生したエラー内容をログに残しておく方法(トレースバック / traceback)

ここでは、try中に発生したエラー内容をログに残しておき、どんなエラーが発生したかを把握できるようにする方法について説明したいと思います。

tryとexceptに頼りすぎると、欠陥のあるプログラムを見過ごしてしまう場合もありますので、エラーログで「エラーの見える化」しておくことも重要です。

今回は、前回記事でも説明した「traceback」を活用したいと思います。

前回記事「tryとexceptの超簡単な活用例」↓
【python】tryとexceptの超簡単な活用例を紹介!エラー停止を回避(pass/print/traceback) (miya-mitsu.com)

「traceback」でエラーログを見える化したコード例は下記となります。

import traceback

 

a = “文字”
b = 5

 

try:
    if a>b:
        print(b/a)
    elif a==0:
        print(0)
    else:
        print(-b/a)
except:
    print(“a = “+str(a)+” , “+str(type(a)))    #1つめ
    print(“b = “+str(b)+” , “+str(type(b))+”\n”)  #2つめ
    traceback.print_exc()             #3つめ
——————-
出力:
a = 文字 , <class ‘str’>
b = 5 , <class ‘int’>

Traceback (most recent call last):
TypeError: ‘>’ not supported between instances of ‘str’ and ‘int’

try中に「TypeError」が発生した場合に、3つのエラーログを残すようにしています。

1つめは、「aの値」と、「aの型」です。printで表示するために、str(a)で文字列変換しています。type(a)とは現在aに代入されている値の型を返しています。この場合はa=”文字”なので、strが返ってきます。

2つめは、「bの値」と、「bの型」です。1つめと同様の内容です。あと”/n”は改行の意味ですが、出力画面で文字が連続すると見にくいので改行を入れています。別になくても問題ありません。

3つめは、「traceback」によるtry中のエラーログ内容の表示です。今回は、a=”文字”なので、try中のif a>bのところで「TypeError」が発生しています。なので、tracebackにおいてもエラーログが「TypeError: ‘>’ not supported between instances of ‘str’ and ‘int’」と返してくれています。

以上が、tryとexceptでのエラーログを残しておくコード例の紹介でした。

最後に

今回は、エラー停止の回避(スルー/無視)によく使われる「tryとexcept」において、相性の良いif文を組み合わせた活用例を紹介させていただきました。

ぜひ自動化プログラムに活用頂けたらと思います。またエラーログを残すのも大事だと思いますので、tracebackの活用を参考いただけたらと思います。

Pythonを早く身に付けたい人は

Python初心者はUdemy動画での勉強がおすすめです。

アメリカの現役エンジニアが、業務で使えるコーディングを基礎から丁寧に教えてくれます。




プログラミングの学習相談

プログラミングの独学は挫折する確率が70%と言われており非常に高いです。

専門用語が多く勉強の仕方も良く分からないのが原因です。独学での学習が捗らない方は学習方法の相談をプロにしましょう。

おすすめは無料で相談できる下記です。



★プログラミング学習で悩んでいる人


★ITエンジニア転職まで考えている人



タイトルとURLをコピーしました