Code Fix

上級

except: だけで書くと本当のバグまで隠れる

except:とだけ書くとあらゆる例外を捕まえてしまい、想定していたエラーだけでなく、コードの本当のバグ(NameErrorなど)まで静かに隠してしまいます。

なぜエラーが出ないのか

出力: 0
(エラーなし)
Pythonは何も報告しません。文法として正しいためです
出力: 0
実際の挙動 — 期待した結果と食い違っている箇所
見つけ方
エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます

このエラーが出る典型パターン

パターン1

 1  def average(nums):
 2      try:
 3          return total     / len(nums)
                       ^
 4      except:
 5          return 0
 6  
 7  print(average([1, 2, 3]))
出力: 0期待: 2.0 (エラーにはなりません)

totalという変数はどこにも定義されていません。本来ならNameErrorになるはずですが、exceptが何もかも捕まえてしまうため、バグに気づかないまま0が返り続けます。

直し方: totalsum(nums) にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  def total_price(items):
 2      try:
 3          return sum(prices)
                          ^
 4      except:
 5          return 0
 6  
 7  print(total_price([10, 20, 30]))
出力: 0期待: 60 (エラーにはなりません)

pricesという変数は存在しません。bareなexceptがNameErrorまで飲み込んでしまい、合計が常に0になるバグが表に出てきません。

直し方: pricesitems にします。

この問題を解いてみる →

パターン3

 1  def max_score(scores):
 2      try:
 3          return max(score    )
                           ^
 4      except:
 5          return 0
 6  
 7  print(max_score([70, 85, 60]))
出力: 0期待: 85 (エラーにはなりません)

引数名のscoresを単数形のscoreと打ち間違えています。except:が全ての例外を握りつぶすため、この単純な誤字にすら気づけません。

直し方: scorescores にします。

この問題を解いてみる →

よくある誤解

「とりあえずexceptで囲んでおけば安全」と思われがちですが、逆です。何が起きたかを特定できなくなり、デバッグを著しく困難にします。捕まえたい例外の種類は必ず明示します。

まとめ

except: だけで書くと本当のバグまで隠れるは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)