1. ホーム
  2. python

[解決済み] 何かを「試して」例外をキャッチするか、例外を回避することが可能かどうかを最初にテストする方が良いですか?

2022-05-02 21:20:54

質問

テストする必要があります if が有効であるか、単に try を実行し、例外をキャッチするか?

  • ある方法が望ましいとする確かな文書はありますか?
  • より パイソン ?

例えば、こうすればいい

if len(my_list) >= 4:
    x = my_list[3]
else:
    x = 'NO_ABC'

または

try:
    x = my_list[3]
except IndexError:
    x = 'NO_ABC'


いくつかの考えを...

PEP 20 は言う。

エラーは決して無言で通過してはならない。

明示的に黙殺しない限り。

を使用する必要があります。 try の代わりに if は、エラーを黙って通過していると解釈されるのでしょうか? もしそうなら、この方法で使用することで明示的にサイレンスにし、それゆえOKにしているのでしょうか?


私は ではなく というのは、例えば、1つの方法しかできないような状況のことを指します。

try:
    import foo
except ImportError:
    import baz

解決方法は?

を選択する必要があります。 try/except オーバー if/else という結果になるのであれば

  • 高速化(余分なルックアップを防ぐなど)
  • コードのクリーン化(行数の削減/読みやすさ)

多くの場合、これらは両立します。


スピードアップ

によって長いリストの中から要素を探そうとする場合。

try:
    x = my_list[index]
except IndexError:
    x = 'NO_ABC'

の場合、try, except が最適な選択肢となります。 index はおそらくリストの中にあり、通常IndexErrorは発生しません。このようにすれば if index < len(my_list) .

Pythonは例外の使用を推奨しています。 を処理します。 のフレーズです。 Pythonに飛び込む . あなたの例では、例外を(優雅に)処理するだけでなく、例外を発生させるのではなく サイレントパス また、例外が発生するのは 例外的な インデックスが見つからない場合(そのため 例外 !).


よりクリーンなコード

Python公式ドキュメンテーションでは EAFP : 許可より許しを請う方が簡単 そして ロブ・ナイト は、次のように記しています。 エラーを回避するのではなく、エラーをキャッチする その結果、コードがきれいになり、読みやすくなります。彼の例では、次のように言っている。

もっと悪い (LBYL「跳ぶ前に見ろ」) :

#check whether int conversion will raise an error
if not isinstance(s, str) or not s.isdigit():
    return None
elif len(s) > 10:    #too many digits for int conversion
    return None
else:
    return int(s)

より良い (EAFP:許可より許しを請う方が簡単) :

try:
    return int(s)
except (TypeError, ValueError, OverflowError): #int conversion failed
    return None