Pythonエラーハンドリング入門 ― try, except, finallyで安心プログラム作成ってどうなんだろう?

プログラムを書いていると、どうしても予期しないエラーにぶつかることがありますよね。

DB接続も出し、よくわからないメモリアクセスとか、、、

実際、実行中にエラーが起こるとプログラムが止まっちゃうのは困ります。そこで頼りになるのがエラーハンドリングです。try, except, finallyを上手く使えば、エラーが起こっても落ち着いて処理を続けられるようになるって話で、C#の時も書いてたので、Pythonでの使い方を覚えてゆきたい。

1. はじめに

まず、エラーハンドリングっていうのは、プログラム内で発生する例外(エラー)に対して、あらかじめ対処方法を用意しておく仕組みのこと。 (Rustはきっとこういうのが少ないだろうなぁ〜)

例えば、ユーザーの入力ミスでエラーになったときに、そのまま止まるんじゃなくて、「エラーが起こったけど、こうしたらいいよ」とフォローできたら、プログラム自体の信頼性も上がるんじゃないかと考えてます。

2. try, except, finallyの基本

tryブロック

まず、tryブロックに、エラーが起こるかもしれない処理をまとめる。ここでエラーが発生すると、プログラムはそのまま落ちるんじゃなくて、exceptブロックに処理が移るらしい。

try:
    x = int("abc")  # これは例外を起こす
except:
    print("エラーが発生したみたい")

この例だと、文字列”abc”を整数に変換しようとして失敗するので、exceptブロックに飛ぶ感じになる。

exceptブロック

exceptブロックでは、try内で発生したエラーに応じた対処をする。エラーの種類を指定すれば、もっと細かく処理できる。

ただ、 exceptなんだよね。 catchを書きそうになるよね。

try:
    x = int("abc")
except ValueError:
    print("値の変換に失敗したみたい")

こうすると、ValueErrorの場合だけ特定のメッセージを出すことができる。もしどんなエラーが来ても良いなら、エラーオブジェクトをキャッチする方法もある。

try:
    x = int("abc")
except Exception as e:
    print("エラーが発生したみたい:", e)

finallyブロック

finallyブロックは、エラーの有無にかかわらず、必ず最後に実行される部分。たとえば、リソースの解放や後処理が必要なときに使えてたよ。C#ではね。

try:
    x = int("abc")
except Exception as e:
    print("エラー:", e)
finally:
    print("必ず実行される処理")

これで、エラーがあってもなかったとしても「必ず実行される処理」が行われる、ってわけですね。

3. もう少し応用的な使い方

複数のexceptブロック

複数のエラーに対して、それぞれ違う対処をしたい場合は、exceptブロックを複数記述する。

try:
    value = int(input("数字を入力してみて: "))
    result = 100 / value
except ValueError:
    print("数字じゃなかったみたい")
except ZeroDivisionError:
    print("0じゃ割れないらしい")
else:
    print("計算結果:", result)
finally:
    print("処理終了")

いいよね。心配性の私には嬉しい。

この例では、ユーザーの入力が数字じゃない場合、または0が入力された場合に適切なメッセージを表示し、エラーがなければ計算結果を表示するようになっている。elseブロックは、エラーが発生しなかったときに実行されるらしいので、条件が合えば使ってみると良いかも。

独自の例外を作る

場合によっては、自分で例外クラスを作ることで、より詳細なエラー処理ができるらしい。たとえば、特定のエラー条件に対して独自のメッセージを設定することができる。

class MyError(Exception):
    pass

try:
    raise MyError("独自エラー発生みたい")
except MyError as me:
    print("MyError:", me)

こんな感じで、自分のエラーを定義しておくと、あとでコードのメンテナンスもしやすくなるかもしれない。

4. エラーハンドリングのメリットと注意点

メリット

  • エラー発生時にプログラム全体が落ちるのを防げる

    • 予期せぬエラーでサービスが止まらないようにできる。
  • ユーザーに適切なエラーメッセージを表示できる

    • 使いやすいアプリケーション作りにつながる。
  • リソースの解放や後処理を必ず実行できる

    • finallyブロックがその役割を果たしてくれる。

注意点

  • エラーをただ隠してしまうと、何が問題だったのか分からなくなるかも

    • 例外オブジェクトをしっかり確認した方が良い場合があり
  • 複雑すぎるハンドリングは、逆にコードが見にくくなる可能性がある

    • 必要最低限に留めるのが良さそう
  • どんなエラーもキャッチしてしまうと、本当は気付くべき問題を見逃す危険もあるらしい

5. まとめ

Pythonのエラーハンドリングは、try, except, finallyをうまく使えば、エラーが起こってもプログラムを落とさずに処理を続けられる、という大事な機能です。

基本的な使い方として、tryブロックでエラーが起こりうる処理を囲い、exceptブロックでエラーに応じた対処をし、finallyブロックで必ず実行したい処理を書く。

これにつきますね。。 エラーハンドリングは、API連携、DBデータを扱う時とか、特に僕は書きますね。ファイル操作とかもですかね。

また、複数のexceptブロックやelseブロック、独自例外の定義など、さらに柔軟なエラーハンドリングも可能らしい。 ただ、どれも過剰にならず、適切なバランスを保つことが大切かもしれない。 エラーはプログラムが生きる上で避けられない現象だから、しっかりと対処して安心して動くプログラム作りに役立てたいと思う。

この記事を読んで、少しでもエラーハンドリングの基本が掴めたなら嬉しいし、実際に自分のコードでも試してみると良いかもしれない。エラーにうまく対処できれば、プログラムがもっと安定して動くようになるはずだ。 …こんな感じで、Pythonエラーハンドリングについてまとめてみたけど、参考になればいいなと思う。 次はAPIかな?まずはどんなAPIを作るか考えようかな。

引き続き、よろしくお願いいたします。

本日の商品紹介です。 宮古島ふるさと納税です。ブログの背景にしているのですが、宮古島の海が好きで、、、応援したく、、、 よろしくお願いいたします。