Pythonで例外を出力する方法は?


回答:


1062

Python 2.6以降およびPython 3.xの場合:

except Exception as e: print(e)

Python 2.5以前の場合は、次を使用します。

except Exception,e: print str(e)

41
str( KeyError('bad'))=> 'bad'-例外の種類を知らせない
Dave

10
keyerrorsのprint(e)はキーのみを提供するように見えますが、完全な例外メッセージは提供されないようです。これはあまり役に立ちません。
Veggiet

14
例外を出力する場合は、を使用することをお勧めしますprint(repr(e))。基本Exception.__str__実装は、タイプではなく例外メッセージのみを返します。または、traceback現在の例外、フォーマット済み、または完全なトレースバックを出力するメソッドを持つモジュールを使用します。
Martijn Pieters

453

tracebackモジュールはのための方法を提供書式設定と例外印刷すると、そのトレースバックを、デフォルトのハンドラが行うように例外を印刷し、これを例えば:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

出力:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero

4
独自の印刷ルーチンを使用して他のものを追加しているときに、表示して印刷できるget_error_message呼び出しの種類がありますか?
MikeSchem 2018年

11
@MikeSchem error_message = traceback.format_exc()
2019

3
ありがとう、これは私が欲しかったものです。エラーの種類とメッセージだけでなく、全体のトレース
Ken Bellows

これは、キャプチャされた例外オブジェクトを使用しません。コードを拡張して「ex」を使用できますか?-のようにexcept Exception as ex:...
aaronsteers

@aaronsteersは、キャプチャされた例外を使用します。例外ハンドラでは、現在の例外はsys.exc_info()関数を介して利用でき、traceback.print_exc()関数はそこから取得します。例外を処理しない場合、または別の例外に基づいて情報を表示したい場合にのみ、明示的に例外を渡す必要があります。
Martijn Pieters

169

Python 2.6以上、それは少しクリーナーです:

except Exception as e: print(e)

古いバージョンでは、それはまだかなり読みやすいです:

except Exception, e: print e

15
python3では、「as」を使用して1番目の方法を使用する必要があります。
サムワトキンス2014

53

エラー文字列を渡したい場合のエラーと例外(Python 2.6)の例を以下に示します。

>>> try:
...    raise Exception('spam', 'eggs')
... except Exception as inst:
...    print type(inst)     # the exception instance
...    print inst.args      # arguments stored in .args
...    print inst           # __str__ allows args to printed directly
...    x, y = inst          # __getitem__ allows args to be unpacked directly
...    print 'x =', x
...    print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

38

(@jldupontの回答に対するコメントとしてこれを残していましたが、十分な評判がありません。)

他の場所でも@jldupontのような回答を見てきました。FWIW、私はこれに注意することが重要だと思います:

except Exception as e:
    print(e)

エラー出力をsys.stdoutデフォルトで出力します。一般的なエラー処理へのより適切なアプローチは次のとおりです。

except Exception as e:
    print(e, file=sys.stderr)

import sysこれが機能するために必要なことに注意してください。)このようにして、のSTDERR代わりにエラーがSTDOUT出力され、適切な出力の解析/リダイレクト/などが可能になります。問題は厳密には「エラーの出力」に関するものだったと理解していますが、最終的にはより良く学習しない人のために非標準のコードにつながる可能性がある詳細を省略するのではなく、ここでベストプラクティスを指摘することが重要に思われます。

私はtracebackCat Plus Plusの答えのようにモジュールを使用していません、そしておそらくそれが最善の方法ですが、私はこれをそこに捨てると思いました。


1
さらにflush = Trueを追加することをお勧めします。systemdで(適切なログフレームワークを使用せずに)気付いたのですが、ジャーナルにキャプチャするときのバッファリングは、私が期待したものではありません。
キャメロンカー

20

Python 3: logging

基本print()機能を使用する代わりに、より柔軟なloggingモジュールを使用して例外をログに記録できます。このloggingモジュールは、特定のログファイルへのメッセージのロギング、タイムスタンプ付きのメッセージのロギング、およびロギングが発生した場所に関する追加情報など、多くの追加機能を提供します。(詳細については、公式ドキュメントをご覧ください。)

例外のログは、次のlogging.exception()ようなモジュールレベルの関数で実行できます。

import logging

try:
    1/0
except BaseException:
    logging.exception("An exception was thrown!")

出力:

ERROR:root:An exception was thrown!
Traceback (most recent call last):
  File ".../Desktop/test.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero 

ノート:

  • 関数logging.exception()は例外ハンドラーからのみ呼び出す必要があります

  • (thanks @PrakharPandey)loggingを回避するために、モジュールをロギングハンドラー内で使用しないでください。RecursionError


代替ログレベル

次のexc_info=Trueようにキーワード引数を使用して、別のログレベルで例外を記録することもできます。

logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)

1
RecursionErrorを回避するためにログハンドラー内で使用しないでください
Prakhar Pandey

4

それがあなたがやりたいことなら、1つのライナーエラーの発生はassertステートメントで行うことができます。これは、静的に修正可能なコードを記述し、エラーを早期にチェックするのに役立ちます。

assert type(A) is type(""), "requires a string"

2

例外をキャッチするときに、トレースバックのどの情報を表示/記録するかについて、かなりの制御ができます。

コード

with open("not_existing_file.txt", 'r') as text:
    pass

次のトレースバックが生成されます。

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

完全なトレースバックを印刷/ログ

他の人がすでに述べたように、トレースバックモジュールを使用して、トレースバック全体をキャッチできます。

import traceback
try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    traceback.print_exc()

これにより、次の出力が生成されます。

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

ロギングを使用して同じことを達成できます:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    logger.error(exception, exc_info=True)

出力:

__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
  File "exception_checks.py", line 27, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

印刷/ログエラー名/メッセージのみ

トレースバック全体には関心がないかもしれませんが、例外名や例外メッセージなどの最も重要な情報のみを使用します。

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    print("Exception: {}".format(type(exception).__name__))
    print("Exception message: {}".format(exception))

出力:

Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.