7

python3 プログラムではtry...except、特定のメソッドで発生した例外を発生した例外に格納する特定のブロックがありlistます。簡略化されたバージョンは次のようになります。

def the_method(iterable):
   errors = []
   for i in iterable:
       try:
           something(i)
        except Exception as e:
            errors.append(e)
   return errors

メソッドが戻った後、コンソールにエラーを出力したいと思います。トレースバックと通常のキャッチされない例外の書式設定を使用して例外を出力するにはどうすればよいですか?

4

3 に答える 3

11

モジュールを使用しtracebackます。type(exc)インターフェイスは古いため、 andの使用方法がわからないことに注意してくださいexc.__traceback__。それらを自分で抽出する必要があります:

for exc in errors:
    traceback.print_exception(type(exc), exc, exc.__traceback__)
于 2013-09-06T17:31:57.593 に答える
0

Python の他のオブジェクトと同様に、例外には属性があります。例外の属性を調べることができます。次の例を検討してください。

>>> try:
    import some_junk_that_doesnt_exist
except Exception as error:
    print(dir(error))


['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', '_not_found', 'args', 'msg', 'name', 'path', 'with_traceback']

これは、リスト内の例外ごとに、例外の属性にアクセスできることを意味します。したがって、次のことができます。

for e in err:
    print(e.args)
    print(e.name)
    print(e.msg)

ただし、私が思いつくことの 1 つは、次の行が実際にはエラー リストに複数の例外を追加するべきではないということです。

except Exception as e:
     errors.append(e)

他の誰かが私よりもよく知っているでしょうが、例外は常にここで 1 つのことになるのではないでしょうか (複数の特定の例外をキャプチャしない限り)。

于 2013-09-06T17:21:31.220 に答える
0

print次のようなコマンドで動作しますか

def the_method(iterable):
   errors = []
   for i in iterable:
       try:
           something(i)
        except Exception as e:
            errors.append(e)
   return errors

err = the_method(iterable)
for e in err:
    print e()
于 2013-09-06T17:12:55.630 に答える