9

例:

>>> try:
...    myapp.foo.doSomething()
... except Exception, e:
...    print 'Thrown from:', modname(e)

Thrown from: myapp.util.url

上記の例では、例外は実際には myapp/util/url.py モジュールでスローされました。__name__そのモジュールを取得する方法はありますか?

私の意図は、これをlogging.getLogger関数で使用することです。

4

5 に答える 5

11

これはうまくいくはずです:

import inspect

try:
    some_bad_code()
except Exception, e:
    frm = inspect.trace()[-1]
    mod = inspect.getmodule(frm[0])
    print 'Thrown from', mod.__name__

編集: Stephan202 はコーナーケースについて言及しています。この場合、ファイル名をデフォルトにすることができると思います。

import inspect

try:
    import bad_module
except Exception, e:
    frm = inspect.trace()[-1]
    mod = inspect.getmodule(frm[0])
    modname = mod.__name__ if mod else frm[1]
    print 'Thrown from', modname

問題は、モジュールがロードされない場合 (そのファイル内のコードの読み取り中に例外がスローされたために)、inspect.getmodule呼び出しが None を返すことです。したがって、問題のあるフレームが参照するファイルの名前を使用するだけです。(これを指摘してくれてありがとう、Stephan202!)

于 2009-07-08T05:19:23.923 に答える
7

と一緒にtraceback モジュールを使用してsys.exc_info()、プログラムでトレースバックを取得できます。

try:
    myapp.foo.doSomething()
except Exception, e:
    exc_type, exc_value, exc_tb = sys.exc_info()
    filename, line_num, func_name, text = traceback.extract_tb(exc_tb)[-1]
    print 'Thrown from: %s' % filename
于 2009-07-08T01:15:58.167 に答える
0

これでうまくいくはずです:

import inspect
def modname():
    t=inspect.trace()
    if t:
        return t[-1][1]
于 2009-07-08T01:06:58.827 に答える
0

Python のログ パッケージは既にこれをサポートしています。ドキュメントを確認してください。%(module)sフォーマット文字列で指定するだけです。ただし、これにより、例外がキャッチされたモジュールが得られます。例外が発生したモジュールと必ずしも同じではありません。もちろん、トレースバックは、例外が発生した正確な場所を示します。

于 2009-07-08T06:01:38.660 に答える
-1

CrashKit が Python スタック トレースからクラス名とパッケージ名を計算する方法について、会社のブログで記事を書いています。 html" rel="nofollow noreferrer">Python スタック トレース サガ」. 作業コードが含まれています。

于 2009-07-23T01:36:25.583 に答える