2

Python でカスタム バックアップ スクリプトを作成しています。mkdir 関数や print 関数、その他の関数がさまざまな理由で失敗することがあります。このような例外により、スクリプト全体が停止し、バックアップが途中で停止するため、非常にイライラします。これまでのところ、try: ... except: ... ステートメントを追加し、これらの例外を適切に管理することで、これらの問題に対処してきました。ただし、ある日、まだトリガーされていない他の理由により、他のステートメントまたは関数でも例外が発生する可能性があります。

とにかくスクリプトを続行するように指示する方法はありますか? コードのすべてのステートメントを try: ... except: pass 句でラップするのと同じですか? もちろん、ログの方が良いでしょう。

Tkinter などの GUI ツールキットを使用してプログラミングすると、例外が発生してもアプリケーションが実行され続けることに気付きました。コンソールでこの種のことを達成することは可能ですか?

4

7 に答える 7

4

実際には、まさにそれを行うはずのモジュールがあります: https://github.com/ajalt/fuckitpy

明らかに冗談で書いたのに。そのようなことをするのが良い考えだという状況は想像できません。神様、それを解決策として提案しているなんて信じられません。

代わりにすべきことは、どのコード行がどの種類のエラーを生成する可能性があるかを特定し、それらのエラーを適切に処理することです。エラーが実際に発生する可能性がある場所は非常に限られています。ほとんどの場合、ファイルシステム、ネットワーク、ユーザー入力などを含む外部システムとのインターフェイス中に発生します。また、実際に失敗することは、「作業」を続けてデータやファイルなどを台無しにするよりも良い場合が多いことを覚えておいてください。の上。例外には理由がありますが、グイドの悪意によるものではありません。

于 2015-11-22T22:08:28.017 に答える
3

Python にはそれを行う方法がなく、正当な理由があります。

「堅牢な」ソフトウェアを作成することの意味について混乱しているようです。堅牢なプログラムとは、殺すのが難しく、何があっても実行し続けるプログラムではなく、エッジケースを適切に処理するプログラムです。走り続けるだけでは十分ではありません...賢明なことをしながら走り続けることが重要なポイントです。

残念ながら、合理的なことを自動的に行う方法はなく、ケースバイケースでエラーの処理方法を考える必要があります。

プログラムにたくさんある場合、catchそれはめったに良いプログラムではないことに注意してください。例外は、多くの場所で発生し、ほとんどどこにもキャッチされないことを意図しています。

また、every はバグの原因となる可能性があることにも注意してくださいcatch。たとえば、次のようになります。

try:
    print my_dict[foo()]
except KeyError:
    ...

KeyErrorに存在しないキーにアクセスするために が来ているのmy_dictか、代わりに からエスケープされているのかを区別できませんfoo()。2 つのケースが同じように処理されることはめったにありません...

より良いのは次のように書くことです:

key = foo()
if key in my_dict:
    print my_dict[key]
else:
    ...

そのため、キー入力が欠落しているという副次的なケースのみmy_dictが処理され、代わりにKeyError例外がプログラムを停止します (プログラムが何をしているのかわからないときにプログラムを停止するのが唯一の合理的な方法です)。

于 2015-11-22T22:17:35.123 に答える
0

@Kanwar Saad が提案したような一般的な except ブロックを追加できます。問題は、例外が発生した後、有効な状態でプログラムを続行できるかどうかです。

Zen of Python から:

Errors should never pass silently.
Unless explicitly silenced.

私の意見では、知っているすべての例外をキャッチしようとすることが、ここに行く最善の方法です。例外を明示的にキャッチできない場合は、回避しようとしないでください。あなた (およびあなたのユーザー) は、何がうまくいかなかったのかを正確に知る必要があります。

バックアップ データの損失が心配な場合は、次のようなことができます。

def save_unfinished_backup():
    # try to find a graceful exit without losing any data

try:
    # some code
except OSError:
    # handle oS Errors
except Exception:
    save_unfinished_backup()
    raise

このようにして、データ損失を回避する機会と、それをデバッグするための正確なエラーの両方を得ることができます。

これが役立つことを願っています!


面白いことに、fuckitモジュールを使用することもできます。構文エラーを含むすべてのエラーを沈黙させます。ただし、これを生産的なコードで使用しないでください。

これは完全に機能するはずです。「foo」は出力されませんがprint("bar")、クラッシュせずに到達します。

import fuckit

with fuckit:
    prnt("foo")

print("bar")
于 2015-11-22T22:20:43.070 に答える