11

tryこの/exceptステートメントには 2 つの目的があります。

  1. return問題が発生しなかった場合は 1、問題が発生した場合は 0にする必要があります。
  2. 例外を発生させてスクリプトを終了する必要があります。

私はreturn働く価値があります。私もSystemExit()仕事をしています。しかし、一緒に、それらは機能していません。

私のPythonスクリプト(関連):

except IOError:
    value_to_return = 0
    return value_to_return
    raise SystemExit("FOOBAR")

これで、そのraise SystemExit("FOOBAR")行は完全に無視されます。戻り値を取得するにはどうすればよいraise SystemExit("FOOBAR")ですか? これは初歩的なことかもしれませんが、実際にはかなり苦労しています。

4

6 に答える 6

13

返却と引き上げは相互に排他的です。

上げるSystemExitとスクリプトが終了します。いくつかのクリーンアップ ルーチンが実行されます。呼び出し元が本当に必要な場合は、それをキャッチしSystemExitてキャンセルできますが、ほとんどの場合、その場で実行を停止するものと考えることができます。呼び出し元は、戻り値を確認したり、意味のあることをしたりする機会を得ることはありません。

戻るということは、スクリプトを続行することを意味します。続行するということは、呼び出し元に を発生させることをSystemExit意味する場合もあれば、エラーを無視することを意味する場合もあれば、別のことを意味する場合もあります。コードを書くのはあなたなので、それが何を意味するかはあなた次第です。

最後に、このエラーを処理する必要がありますか? システムをシャットダウンするためだけに例外をキャッチすることは、最も有用な動作ではない場合があります。これは問題に対処するためのユーザー フレンドリーな方法ではなく、スタック トレースから得られる有用なデバッグ情報がすべて隠されています。

于 2014-01-21T00:33:21.893 に答える
3

呼び出し後に使用される「returning_value」引数でエラーを発生させることができます。

あなたの問題に対する別のpythonicの答えは、レイズでエラー引数を利用し、呼び出しでエラーを管理して値を取得し、文字列から変換して「リターンっぽい」を取得することです。

def your_f():
    try:
      some_io_thingy_ok()
      return 1
    except IOError:
        raise SystemExit("FOOBAR", 0)

try:
    my_returning_value = your_f()
except SystemExit as err:
    my_returning_value = err.args[1]


print(my_returning_value)

Python 3 ドキュメントから:

例外が発生すると、例外の引数とも呼ばれる値が関連付けられている場合があります。引数の存在とタイプは、例外のタイプによって異なります。

except 句では、例外名の後に変数を指定できます。変数は、引数が instance.args に格納されている例外インスタンスにバインドされます。便宜上、例外インスタンスは str () を定義しているため、.args を参照しなくても引数を直接出力できます。例外を発生させる前に最初に例外をインスタンス化し、必要に応じて属性を追加することもできます。

于 2020-08-15T18:12:29.593 に答える
2

スクリプトを終了して終了ステータスを返すには、次を使用しますsys.exit()

import sys
sys.exit(value_to_return)
于 2014-01-21T00:41:40.657 に答える
0

あなたが探しているのは、次のようなものだと思います。

def some_function():
    # this function should probably do some stuff, then return 1 if
    # it was successful or 0 otherwise.
    pass

def calling_function():
    a = some_function()
    if a == 1:
        raise SystemExit('Get the heck outta here!')
    else:
        # Everything worked!
        pass
于 2014-01-21T00:33:11.010 に答える