3

私はさまざまなエラーチェック方法を持っていますが、それらは主に値または型のチェックであり、プログラムが何をしているかに関する多くの情報を失わないように、ユーザーに修正する機会を与えたいと考えています。

この時点で、私はこれを持っています:

def foo(Option1, Option2): 
    if Option1 >= 0 and Option <= 100 :
        continue
    else:
        e = ('Hey this thing doesn\'t work')
        raise ValueError(e)

そして、それを呼び出しているプログラムの後半で、私は持っています

except ValueError as e:
    print(e)

print(e) ステートメントがある場所のすぐ後に、プロンプトや何かを使用して、ユーザーに再試行の機会を与えることができるように、どのメソッドが問題であったかを渡したいと思います。何か案は?

編集:

基本的に、exceptコードを次のようにしたいと思います

except ValueError as e:
    # print the error
    # get what method the error was raised in
    # method = the_method_from_above
    # prompt user for new value
    # send command to the method using the new value
4

4 に答える 4

3

traceback モジュールを使用して、例外に関するスタック トレース情報を提供できます。

import traceback
...
try:
  pass
except ValueError as e:
  print("Error {0}".format(e))
  traceback.print_exc()
于 2013-06-07T13:58:38.013 に答える
2

これは内省によって行うことができますが、そうすべきではありません

次のコードでは、例外が発生した関数を呼び出すことができますが、達成しようとしているものを実行するためのより良い方法がほぼ確実にあります...

import sys

def foo(x):
    print('foo(%r)' % x)
    if not (0 <= x <= 100):
        raise ValueError

def main():
    try:
        foo(-1)
    except ValueError:
        tb = sys.exc_info()[2]
    while tb.tb_next is not None:
        tb = tb.tb_next
    funcname = tb.tb_frame.f_code.co_name
    func = globals()[funcname]
    func(50)

if __name__ == '__main__':
    main()

...出力する...

foo(-1)
foo(50)
于 2013-06-07T17:25:36.300 に答える
1

それはすべて、コードの残りの部分がどのように見えるかに大きく依存します。達成したいことに対する簡単な解決策はありません。そのためには、関数参照だけでなく、アプリケーションの現在の状態も保存する必要があります。プログラムがループ内で情報を処理する場合、次のようなものを使用できる場合があります。

while XXX:
    try:
        o1, o2 = get_user_input_somehow(...)
        foo(o1, o2)
    except ValueError as e:
        print "Error:",e
        print "Please try again"
于 2013-06-07T14:04:44.493 に答える
0

Python がtracebackと呼ぶものが必要です。この標準機能により、例外の受信者は、例外がスローされた場所からコール スタックを確認できます。

于 2013-06-07T13:58:54.263 に答える