回答:
Python 2.6以降およびPython 3.xの場合:
except Exception as e: print(e)
Python 2.5以前の場合は、次を使用します。
except Exception,e: print str(e)
str( KeyError('bad'))
=> 'bad'
-例外の種類を知らせない
print(repr(e))
。基本Exception.__str__
実装は、タイプではなく例外メッセージのみを返します。または、traceback
現在の例外、フォーマット済み、または完全なトレースバックを出力するメソッドを持つモジュールを使用します。
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
error_message = traceback.format_exc()
except Exception as ex:
...
sys.exc_info()
関数を介して利用でき、traceback.print_exc()
関数はそこから取得します。例外を処理しない場合、または別の例外に基づいて情報を表示したい場合にのみ、明示的に例外を渡す必要があります。
Python 2.6以上、それは少しクリーナーです:
except Exception as e: print(e)
古いバージョンでは、それはまだかなり読みやすいです:
except Exception, e: print e
エラー文字列を渡したい場合のエラーと例外(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
(@jldupontの回答に対するコメントとしてこれを残していましたが、十分な評判がありません。)
他の場所でも@jldupontのような回答を見てきました。FWIW、私はこれに注意することが重要だと思います:
except Exception as e:
print(e)
エラー出力をsys.stdout
デフォルトで出力します。一般的なエラー処理へのより適切なアプローチは次のとおりです。
except Exception as e:
print(e, file=sys.stderr)
(import sys
これが機能するために必要なことに注意してください。)このようにして、のSTDERR
代わりにエラーがSTDOUT
出力され、適切な出力の解析/リダイレクト/などが可能になります。問題は厳密には「エラーの出力」に関するものだったと理解していますが、最終的にはより良く学習しない人のために非標準のコードにつながる可能性がある詳細を省略するのではなく、ここでベストプラクティスを指摘することが重要に思われます。
私はtraceback
Cat Plus Plusの答えのようにモジュールを使用していません、そしておそらくそれが最善の方法ですが、私はこれをそこに捨てると思いました。
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)
例外をキャッチするときに、トレースバックのどの情報を表示/記録するかについて、かなりの制御ができます。
コード
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'