質問

を取得することはできまパラメータの最後の機能を呼び出してトレースバック?いかがですか?

作りたいキャッチャーのための標準誤差を読みやコード、詳細な情報を提供するユーザーです。

以下の例でいGET_PARAMSに戻っ要素からなるタプルのパラメータに供給されます。chown.を検討し inspect モジュールを務めるアレックスMartelli、私は見当たらない。

def catch_errors(fn):
    def decorator(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except (IOError, OSError):
            msg = sys.exc_info()[2].tb_frame.f_locals['error_message']
            quit(msg.format(SEQUENCE_OF_PARAMETERS_OF_THE_LAST_FUNCTION_CALLED)\
            + '\nError #{0[0]}: {0[1]}'.format(sys.exc_info()[1].args), 1)
    return decorator

@catch_errors
def do_your_job():
    error_message = 'Can\'t change folder ownership \'{0}\' (uid:{1}, gid:{2})'
    os.chown('/root', 1000, 1000) # note that params aren't named vars.

if __name == '__main__' and os.getenv('USERNAME') != 'root':
    do_your_job()

ジム-ロバート のためのデコレータ)

役に立ちましたか?

解決

の問題点をデコレータを用いを実現しようとしているのは、フレームの例外ハンドラを取得する do_your_job()s"は os.listdir()s, os.makedirs()sまたは os.chown()s.その情報だける印刷出しの引数 do_your_job().を取得するための行動だと思いまいについて飾るすべての図書館の機能だけます。

他のヒント

な検査業務の立場に立って物事を考えることの最初のモジュール inspect 標準の図書館があります。ここで、 .プロジェクトを作成するgetargvalues また、引数の数値のフレーム、 .プロジェクトを作成するgetinnerframes また、フレームからトレースバックオブジェクトです。

ここでは、このような機能の問題ることはできません。

import sys

def get_params(tb):
    while tb.tb_next:
        tb = tb.tb_next
    frame = tb.tb_frame
    code = frame.f_code
    argcount = code.co_argcount
    if code.co_flags & 4: # *args
        argcount += 1
    if code.co_flags & 8: # **kwargs
        argcount += 1
    names = code.co_varnames[:argcount]
    params = {}
    for name in names:
        params[name] = frame.f_locals.get(name, '<deleted>')
    return params


def f(a, b=2, c=3, *d, **e):
    del c
    c = 4
    e['g'] = 6
    assert False

try:
    f(1, f=5)
except:
    print get_params(sys.exc_info()[2])

の出力です:

{'a': 1, 'c': 4, 'b': 2, 'e': {'g': 6, 'f': 5}, 'd': ()}

僕の使用 inspect.getinnerframes() 示すもののように必要なフレーム。ですが容易に少しでもいくつかの余分な作業はあまり必要とされていないだされながら、比較的遅いinspect.getinnerframes() を読み込みソースファイル毎にモジュールのトレースバック;これは重要な一つのデバッグ通話ができ課題その他の場合).

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top