【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動画での学習をおすすめします。

下記リンクから、Udemyのサンプル動画で講義の様子や内容を知ることができますので一度確認してみてください。本当におすすめです。

Udemy講師の方は現役でIT企業に勤めている方で、基礎的なところから応用まで丁寧に教えてくれます。また、実際のIT企業におけるコードの書き方やルールなど、独学では学べないところも教えてくれるので、就職や転職も考えている方にも最初の学習に適していると思います。

ちなみに私はプログラミング初心者でしたが、はじめにUdemy動画で基礎的なところを勉強しました。その後は、ウェブ検索で独学で勉強していますが、今では数千行のプログラムを書いて、完全自動でウェブ情報を収集したり、アプリを動かしたりなどできるようになりました。参考いただけたらと思います。


ここまで読んで頂きありがとうございました。今後もPython初心者に向けて情報発信していきたいと思います。

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