1. ホーム
  2. python

[解決済み] except` 文では常に例外の型を指定する必要がありますか?

2022-11-28 08:52:28

質問

PyCharm IDEを使用しているときに except: を使うと、IDE はこの例外節が Too broad .

このアドバイスは無視すべきなのでしょうか?それとも、例外の型を常に特定するのがPythonicなのでしょうか?

どのように解決するのですか?

ほとんどの場合、明示的に例外の型を指定したほうがよいでしょう。もし、裸の except: これはバグを隠したり、プログラムが期待通りに動いていないときにデバッグを困難にします。

例えば、データベースに行を挿入する場合、行が既に存在することを示す例外をキャッチして、更新を行うことができるようにしたいと思うかもしれません。

try:
    insert(connection, data)
except:
    update(connection, data)

もし、素の except: を指定した場合、データベースサーバーが落ちたことを示すソケットエラーもキャッチすることになります。処理方法を知っている例外のみをキャッチするのが最善です。プログラムは継続しながらも予期しない奇妙な動作をするよりも、例外の発生時点で失敗する方が良い場合が多いからです。

を使いたいと思うかもしれない1つのケースがあります。 except: を使いたい場合の一つは、ネットワークサーバーのように 常に起動している必要があるプログラムのトップレベルにある場合です。しかし、その場合は例外のログを取ることに細心の注意を払う必要があり、そうでなければ何が問題なのかを解明することは不可能になります。基本的に、これを行う場所は、プログラムの中でせいぜい1つだけであるべきです。

この全てに付随することとして、あなたのコードは決して raise Exception('some message') を使うようにクライアントコードに強制するからです。 except: (または except Exception: というのは ほとんど のように悪いものです)。シグナルを送りたい問題に特化した例外を定義する必要があります (たとえば ValueError または TypeError ). あるいは、特定の組み込み例外を発生させる必要があります。これにより、あなたのコードのユーザは、処理したい例外だけをキャッチするように注意することができます。