メインコンテンツにスキップ
モジュール 2 · レッスン 4 / 4コース内の 8/36~12 min
モジュールのレッスン (4/4)

エラー処理: 試行/例外

実行時に何か問題が発生した場合 (ゼロによる除算、キーの欠落、 互換性のない型に対する操作) Python は 例外 を発生させます。なし 処理中に例外が発生してプログラムが中断されます。 try / except を使用すると、 それを捕まえて、何をすべきかを決めることができます。

基本的な形

Python
try:
    risultato = 10 / 0
except ZeroDivisionError:
    risultato = None
risultato  # None
  • try: ブロックには、失敗する可能性のあるコードが含まれています。
  • except <ErrorType>: は、そのエラー タイプが発生した場合にのみ実行されます。 try 内。

例外メッセージのキャッチ

as を使用して、例外オブジェクトを名前にバインドします。

Python
try:
    int("non è un numero")
except ValueError as e:
    messaggio = str(e)
messaggio  # "invalid literal for int() with base 10: 'non è un numero'"

複数のタイプを一緒に

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

型のタプルは、それらの型 (またはサブクラス) の例外をキャッチします。

完全な構造: try / 例外 / else / 最後に

Python
try:
    n = int("42")
except ValueError:
    print("not a number")
else:
    print(f"parsed: {n}")     # executed only if NO exception occurred
finally:
    print("always executed")  # executed regardless, even on exception
  • else — try の成功に依存するコードに使用します。そのままにしておいてください 無関係な例外を誤ってキャッチしないように、別々にします。
  • finally — 常に実行する必要があるクリーンアップ (ファイルを閉じる、ファイルを解放する) リソース)。成功時とエラー時の両方で実行されます。

例外の発生: raise

場合によっては、何か問題が発生したことを知らせたいと思う人もいるでしょう。

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

遭遇して発生する最も一般的な組み込み例外は次のとおりです。

  • ValueError — 値の型は正しいですが、受け入れられません (解析など)。
  • TypeError — タイプが間違っています (例: len(42))。
  • KeyError / IndexError — キー/インデックスがありません。
  • ZeroDivisionError — ゼロによる除算。
  • FileNotFoundError、PermissionError — ファイルシステム操作。

try ブロックの else 節とfinally 節

try ブロックでは、次の 2 つの追加句を定義できます。

  • else: try ブロックが例外を発生させずに完了した場合にのみ実行されます。
  • finally: 例外が発生したかどうかに関係なく、常に実行されます。これは、リソースをクリーンアップする場合 (開いているファイルやデータベース接続を閉じるなど) に最適です。

自分で試してみてください

運動#python.m2.l4.e1
試行回数: 0読み込み中…

int('abc') を試行する式を作成します。ValueError が発生した場合は、文字列 'errore' を `result` に割り当てます。それ以外の場合は番号を割り当てます。 「結果」を評価します。

エディターを読み込み中…
ヒントを表示

int('abc') は ValueError を発生させます。

3 回の試行後に解決策が利用可能になります

復習演習

運動#python.m2.l4.e2
試行回数: 0読み込み中…

a/b を返す `divide(a, b)` を定義しますが、b が 0 の場合は 'divisore zero' というメッセージで ValueError を発生させます。次に、try/Except 内で Division(10, 0) を呼び出し、キャッチした例外の文字列を `message` に割り当てます。

エディターを読み込み中…
ヒントを表示

関数内で ValueError('...') を発生させます。 e として、Except ValueError を使用してキャッチします。

3 回の試行後に解決策が利用可能になります

追加の課題

運動#python.m2.l4.e3
試行回数: 0読み込み中…

\`try-excel\` ブロックを作成して、文字列 \`text_val = "abc"\` を整数に変換します。変換によって \`ValueError\` が発生した場合は、\`None\` を \`result\` に割り当てます。それ以外の場合は、変換された数値を割り当てます。最後に、「結果」を評価します。

エディターを読み込み中…
ヒントを表示

try: result = int(text_val) を使用し、その後に例外 ValueError: result = None を使用します。

3 回の試行後に解決策が利用可能になります