[解決済み】Pythonでtry-except-elseを使用するのは良い習慣ですか?
質問
Pythonで時々、ブロックを見かけます。
try:
try_this(whatever)
except SomeException as exception:
#Handle exception
else:
return something
try-except-elseが存在する理由は何ですか?
例外を使ってフロー制御を行うような、そういうプログラミングは好きではありません。しかし、言語に含まれているということは、それなりの理由があるのではないでしょうか?
例外はエラーではないというのが私の理解です そして、例外的な状況(例えば、ファイルをディスクに書き込もうとしたら、もう容量がないとか、権限がないとか)にのみ使用されるべきで、フロー制御には使用されないということです。
通常、私は例外を次のように処理します。
something = some_default_value
try:
something = try_this(whatever)
except SomeException as exception:
#Handle exception
finally:
return something
あるいは、どうしても例外が起きても何も返したくないのであれば
try:
something = try_this(whatever)
return something
except SomeException as exception:
#Handle exception
解決方法は?
<ブロッククオート無知からくるものなのかわかりませんが、私はそのようなことは好きではありません。 例外を使ってフロー制御を行うようなプログラミングです。
Pythonの世界では、フロー制御に例外を使うことは一般的であり、普通のことです。
Pythonのコア開発者でさえ、フロー制御に例外を使っていますし、そのスタイルは言語に大きく食い込んでいます(例えば、イテレータプロトコルで ストップイテレーション を使用してループの終了を通知します)。
さらに、try-except スタイルを使用することで、いくつかの "look-before-you-leap" の構文があります。例えば os.path.exists の場合、使用する頃には古い情報になっている可能性があります。 同様に キュー.フル は、古くなっている可能性のある情報を返します。 その try-except-else スタイル は、このような場合、より信頼性の高いコードを生成します。
<ブロッククオート例外はエラーではなく、あくまで例外であるというのが私の理解です。 例外的な状況に使用されます。
他の言語では、このルールはライブラリの文化的規範を反映しているものもあります。また、このルールは、それらの言語におけるパフォーマンスへの配慮に部分的に基づいています。
Pythonの文化的規範はやや異なっています。多くの場合、あなたは しなければならない 制御フローに例外を使用します。また、Pythonで例外を使っても、いくつかのコンパイル言語のように周囲のコードや呼び出し元のコードが遅くなることはありません(例. CPython は、実際に例外を使うかどうかにかかわらず、すべてのステップで例外チェックのためのコードをすでに実装しています)。
言い換えれば、「例外は例外のためにある」というあなたの理解は、他の言語では意味をなすルールですが、Pythonでは意味をなしません。
<ブロッククオートしかし、言語そのものに含まれているのであれば、何か理由があるのでしょう。 それなりの理由があるのですね"。
例外は、競合状態を回避するのに役立つだけでなく、エラー処理をループの外側に引き出すのに非常に便利です。これは、自動的なエラー処理機能を持たないインタプリタ型言語では必要な最適化です。 ループ不変のコード運動 .
また、問題を処理する能力が、問題が発生した場所から遠く離れているような一般的な状況では、例外によってコードをかなり単純化することができます。例えば、トップレベルのユーザーインターフェイスコードがビジネスロジックのコードを呼び出し、それが低レベルルーチンを呼び出すというのはよくあることです。低レベルルーチンで発生した状況(データベースアクセスにおけるユニークキーに対する重複レコードなど)は、トップレベルのコードでしか処理できません(既存のキーと競合しない新しいキーをユーザーに要求するなど)。 このような制御フローに例外を使用することで、中間レベルのルーチンはこの問題を完全に無視し、フロー制御のその側面からうまく切り離すことができるのです。
があります。 例外の必要性について書かれたブログ記事はこちらです。 .
また、Stack Overflowの回答もご覧ください。 例外は本当に例外的なエラーのためにあるのですか?
<ブロッククオート"try-except-elseが存在する理由は何でしょうか。
else節そのものが面白いですね。例外がないときに実行され、finally-clauseの前に実行されるのです。それが主な目的だ。
else-clauseがなければ、finalizationの前に追加のコードを実行する唯一の選択肢は、try-clauseにコードを追加するという不器用な方法となる。これは不器用なことで、以下のようなリスクがある。 トライブロックによって保護されることを意図していないコードで例外を発生させる。
ファイナライズの前に保護されていないコードを追加で実行するというユースケースは、あまり発生しません。ですから、公開されているコードで多くの例を見ることは期待しないでください。やや稀なケースです。
else句のもう一つの使用例は、例外が発生しないときに必ず発生し、例外が処理されたときには発生しない動作を実行することである。例えば
recip = float('Inf')
try:
recip = 1 / f(x)
except ZeroDivisionError:
logging.info('Infinite result')
else:
logging.info('Finite result')
もう一つの例は、unittestのランナーで発生します。
try:
tests_run += 1
run_testcase(case)
except Exception:
tests_failed += 1
logging.exception('Failing test case: %r', case)
print('F', end='')
else:
logging.info('Successful test case: %r', case)
print('.', end='')
最後に、try-blockのelse-clauseの最も一般的な使い方は、ちょっとした美化(例外的な結果と例外的でない結果を同じインデントレベルで揃えること)である。この使用は常に任意であり、厳密には必要ありません。
関連
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み] virtualenvで異なるバージョンのPythonを使用する
-
[解決済み] Pythonの "assert "はどのように使うのですか?
-
[解決済み] すべての例外をキャッチする `try`/`except` ブロックはどのように書けばよいですか?
-
[解決済み] Javaにおけるチェック済み例外とチェックされていない例外の理解
-
[解決済み] Pythonのtry-else
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み] Pythonのwith文の使用中に例外をキャッチする
-
[解決済み】なぜ "except: pass "は悪いプログラミング手法なのか?
最新
-
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サンプルコード
-
Python関数の高度な応用を解説
-
PyQt5はユーザーログインGUIインターフェースとログイン後のジャンプを実装しています。
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
Pythonの画像ファイル処理用ライブラリ「Pillow」(グラフィックの詳細)
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】re.subが "Expected string or bytes-like object "でエラーになる。
-
[解決済み] Pythonで例外を手動で発生(スロー)させる