4

このようなことを行うためのより良い方法はありますか:

class SpecialError(Exception):
    pass

try:
    # Some code that might fail
    a = float(a)
    # Some condition I want to check
    if a < 0:
        raise SpecialError
except (ValueError, SpecialError):
    # This code should be run if the code fails
    # or the condition is not met
    a = 999.
4

1 に答える 1

3

明示的に例外を発生させることは、幅広いユースケースで明らかに役立ちます。しかし、ローカルスコープ内でキャッチされるように特別に例外を発生させているときは、おそらくあなたに似た一連の狭いケースについて話しているでしょう。

こちらも一般的には問題ありません。どのユースケースにおいても、それが最も読みやすいコードである場合もそうでない場合もありますが、それは実際には何よりもスタイルの判断です。

マイナーな DRY 違反を犠牲にして、例外なくこれを行うことができます。

try:
    # Some code that might fail
    b = float(a)
    # Some condition I want to check
    if b < 0:
        b = 999.
except ValueError:
    # This code should be run if the code fails
    # or the condition is not met
    b = 999.

…または、ロジックを少し並べ替えるという犠牲を払って:

b = 999.
if a >= 0:
    try:
        b = float(a)
    except ValueError:
        pass

または、 を作成する代わりに、 をSpecialError使用しますValueError。このブロックを超えてエスケープすることはなく、コードはとにかくそれらを同じように扱うため、何も追加していません:

try:
    b = float(a)
    if b < 0:
        raise ValueError
except ValueError:
    b = 999.

あなたが一番好きな方を使ってください。誰も文句を言いません。あなたが一番好きなものが を含まない場合raise、答えは「はい、もっと良い方法があります」だと思います。もしそうなら、答えは「いいえ、それが最善の方法です」です。:)

于 2013-04-12T21:36:10.717 に答える