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

2009年09月27日に質問されました。  ·  閲覧回数 940.2k回  ·  ソース

TIMEX picture
2009年09月27日
try:
    something here
except:
    print('the whatever error occurred.')

except:ブロックにエラー/例外を出力するにはどうすればよいですか?

回答

jldupont picture
2009年09月27日
1208

Python2.6以降およびPython3.xの場合:

except Exception as e: print(e)

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

except Exception,e: print str(e)
Cat Plus Plus picture
2009年09月27日
511

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
ilya n. picture
2009年09月28日
170

Python 2.6以降では、少しクリーンです。

except Exception as e: print(e)

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

except Exception, e: print e
Nick Dandoulakis picture
2009年09月27日
55

エラー文字列を渡したい場合は、エラーと例外(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
grish picture
2018年09月22日
45

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

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

except Exception as e:
    print(e)

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

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

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

Cat PlusPlusの回答のようにtracebackモジュールを使用したことはなく、おそらくそれが最善の方法ですが、これを捨てると思いました。

winklerrr picture
2019年10月30日
29

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()は、例外ハンドラーからのみ呼び出す必要があります

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


代替ログレベル

次のようにキーワード引数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)
GinTonic picture
2020年04月15日
19

例外をキャッチするときに、トレースバックからのどの情報を表示/ログに記録するかをほぼ制御できます。

コード

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'
whatnick picture
2009年09月27日
4

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

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