制御されたエラー処理を除いて 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 は、KeyboardInterrupt や SystemExit などのシステム終了エラーを捕捉し、プログラムの停止とデバッグを困難にします。期待する特定の例外を優先します。
間違い 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をキャッチしないようにします。