[解決済み] 何かを「試して」例外をキャッチするか、例外を回避することが可能かどうかを最初にテストする方が良いですか?
質問
テストする必要があります
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
関連
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】プログラムを停止/終了させることなく、完全な例外トレースバックをキャッチして表示する方法は?
-
[解決済み】C#で例外をキャッチして再スローする理由とは?
-
[解決済み] 配列内の何かの最初のインデックスを返すNumPy関数はありますか?
-
[解決済み】例外処理にtry catchを使うのはベストプラクティスなのか?
-
[解決済み】例外が発生しないのにtry-catchブロックを使うのは高くつく?
-
[解決済み] try {} without catch {} はJavaScriptで可能ですか?
-
[解決済み] try catchブロックのネストを回避するパターン?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
Python 入出力と高次代入の基礎知識
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)
-
[解決済み】あるクラスが他のクラスのサブクラスであるかどうかを(実行時に)確認するにはどうすればよいですか?