制御されたエラー処理を除いて Python を試す

Python tryExcept は実行時エラーを処理するため、プログラムはフォールバックで続行できます。 ユーザー入力の解析やファイルの読み取りが失敗する可能性があるが、残りの作業は実行できるはずである場合に使用します。 重要なのは、危険な行のみをラップし、予期される例外をキャッチし、安全なデフォルトを提供することです。

Python Try Except エラー処理の例

出力:

ここに出力が表示されます...

出力:

0

この例の仕組み

  • try ブロックは、テキストを整数に変換しようとします。
  • int() が失敗すると、except ValueError ブロックはフォールバック値を割り当てます。
  • print はブロックの後に実行されるため、スクリプトは常に使用可能な数値を出力します。
  • 出力にはフォールバック パスが表示され、エラーがクラッシュせずに処理されたことが証明されます。

Python でよくある間違い try 以外

間違い 1: 裸の except ですべてをキャッチします。

try:
    total = int(text)
except:
    total = 0
try:
    total = int(text)
except ValueError:
    total = 0

発生理由: 裸の except は、KeyboardInterruptSystemExit などのシステム終了エラーを捕捉し、プログラムの停止とデバッグを困難にします。期待する特定の例外を優先します。

間違い 2: try 内にコードを入れすぎて、無関係なバグを隠してしまう。

total = 10

try:
    count = int(text)
    ratio = total / count
except Exception:
    ratio = 0
total = 10

try:
    count = int(text)
except ValueError:
    ratio = 0
else:
    ratio = total / count

発生理由: 広範なハンドラーは、大規模に失敗するはずの行からエラーをマスクしてしまう可能性があります。 else ブロックは例外が発生しない場合にのみ実行されるため、予期しないバグが飲み込まれることはありません。

間違い 3: except ブロックを広範なブロックから特定なブロックに順序付けします。

try:
    count = int(text)
except Exception:
    count = 0
except ValueError:
    count = 0
try:
    count = int(text)
except ValueError:
    count = 0
except Exception:
    count = 0

この問題が発生する理由: Python は最初に一致するハンドラーを選択するため、最初に広範な例外が配置されると、特定のハンドラーに到達できなくなります。

パフォーマンスに関する考慮事項

例外のない try ブロックは効率的ですが、例外の発生と捕捉には比較的コストがかかります。通常のフローの一部として障害が予想される場合は、単純な事前チェック (入力の検証など) をより迅速かつ明確に行うことができます。障害が本当に例外的な場合、try および except は、パフォーマンスを大幅に犠牲にすることなく、ハッピー パスを読み取り可能な状態に保ちます。

使用する場合 try 以外

  • 操作が失敗する可能性があり、安全なフォールバック (テキストの解析、ファイルの読み取り、または API の呼び出し) がある場合に使用します。
  • 処理したエラーをログに記録しながら不良項目をスキップすることで、バッチ作業を継続するために使用します。
  • try ブロックをしっかりと固定して、危険な行だけが保護され、他のバグが表面化したままになります。
  • 失敗が常道であり、単純な条件の方が安価で明確な場合は、それを避けてください。
  • 意図を持ってリレイズまたはログしない限り、BaseException または一般的な Exception をキャッチしないようにします。