0

一部のエラー ケースでは例外が発生し、一部では None を返す関数があるとします (これは私が設計したものではなく、使用する必要があります)。ここで、これらのエラーを同じ方法で処理する必要があります (ユーザーにメッセージを表示し、ログに記録して正常に終了します)。

私はこのようなことをしてきました:

try:
    result = weird_func()
except:
    *same functionality* do something here

if not result:
    *same functionality* do the same here as in the except block

しかし、それは本当にひどいです。この 2 つを巧みに 1 つにまとめる方法はありますか? 例外なしで try/finally を使用することを考えていましたが、それはちょっと奇妙に見えます。

助言がありますか?

4

4 に答える 4

5
try:
    result = weird_func()
except TheExceptionYouWantToCatch:
    result = None

if result is None:
    #Whatever you want
于 2013-08-06T04:30:16.703 に答える
1

結果の設定Noneはオプションです。

try:
    result = weird_func()
except:
    result = None

if not result:
    *same functinality* do the same here as in the except block

またはで例外を発生させtryます。

try:
    result = weird_func()
    if not result: raise Exception() # or assert result
except:
    *same functinality* do something here
于 2013-08-06T04:18:09.867 に答える
0

私は通常、 Lennart Regebroの回答と同じパターンを使用します。いくつかの異常なケース、特にファイルに関係するケースでは、次のようなわずかに変更されたバージョンを使用することがあります。

to_close = None
stream = None
try:
    to_close = open(path, mode)
    stream = to_close
    if validate_open_stream(stream):
        to_close = None
finally:
    if to_close is not None:
        to_close.close()
        stream = None
return stream

この特定のシーケンスを使用すると、ファイルを開き (ファイルを開くIOErrorことができない場合に発生する可能性があります)、何らかの方法でそれを検査し (たとえば、適切な「マジック ナンバー」があることを確認し)、開いているストリームをさらに返すことができます。使用する。ファイルが開いているときに何か問題が発生した場合to_closeは、句Noneではないfinallyので、ストリームを閉じて必ず返すようにしNoneます。

(通常、これにはコンテキスト マネージャーが適しています。Python 2.4 以前では、そのパターンが必要でした。)

于 2013-08-06T06:05:52.303 に答える
0

多かれ少なかれfalsetruが言ったこと:

result = wierd_func()
assert result

結果が None の場合、元の例外または AssertionError のいずれかが発生します。囲んでいる try が AssertionError だけでなく、wierd_func が行うその他のこともキャッチできる限り、問題はありません。

完全を期すために、次のものもあります。

try:
   return wierd_func() or RuntimeError() # or whatever you'd like to raise:
except:
   return sys.exc_info()[0]

エラーの場合は常に例外オブジェクトを返すため、そのように回復できます---しかし、私は気にしません:try/catchはエラー状態を処理するためのものなので、アサートを追加してから、すべての例外を1つに処理します場所

于 2013-08-06T04:35:48.243 に答える