Pythonの例外をキャッチしたときに詳細を表示する方法
スポンサーリンク
このドキュメントの内容は、以下の通りです。
はじめに
システム開発・プログラムの開発は、プログラムが止まったとき、エラーが起きたときに、戻り値を見て、エラーを出したり、例外をキャッチして、エラーを出したりするものです。何かエラーが起きた時に、どこまで行って、どういう理由で止まってしまった、エラーになったのか、といった細かい情報がないと、何が悪くて、どのように対処したらよいのかわからないものです。
以下のプログラムは、Pythonのサンプルなので細かいことは、置いときたいのですが、以下のようなコードで例外を受け取ったときに、どこで何が起きたのか、出力を見ても、何もわからないですよね。
#! /usr/bin/env python try: 1/0 except: print("err")
このソースコードだととりあえずエラーと表示されるだけです。
どこまで行ったのかを知るために、print文を書きまくるのはナンセンスですし、出力が増えすぎて、大事な表示が埋もれてしまって解りにくくなってしまいます。C言語で言うprintfデバッグは、正直難易度が高いです。
traceback モジュールを使う
1つの解は、 traceback モジュールを使うことです。Python のサンプルコードを以下のように変更しました。
#! /usr/bin/env python try: 1/0 except: print("err") import traceback traceback.print_exc()
これを実行してみると、以下の情報が得られるようになりました。
$ python /tmp/t1.py Traceback (most recent call last): File "/tmp/t1.py", line 14, in <module> 1/0 ZeroDivisionError: division by zero err
表示をカラフルにする
colored-traceback を使うと、例外の表示をカラーにできます。
sudo pip3 install colored-traceback
ターミナルとスクリーンショットを掲載すれば良いのですが・・・。試して、実際に見てください。
>>> import colored_traceback.always >>> 1/0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero
例外を見やすくする
例外のメッセージを見やすく方法として better-exceptions が挙げられます。標準のモジュールではないので、インストールが必要です。
sudo pip install better-exceptions
better_exceptions を import します。
#! /usr/bin/env python # -*- coding: utf-8 -*- import better_exceptions class C(): def __init__(self): pass def doit(self, x): a = x / 0 return a def func1(x): c = C() a = c.doit(x) return a def func2(x): return func1(x)*2 x = func2(10) print(x)
環境変数 BETTER_EXCEPTIONS をセットして実行します。この環境変数が設定されていないと、標準の表示になります。
env BETTER_EXCEPTIONS=1 python3.4 ./b2.py
better_exceptions を import した場合の例外エラーは以下の形になります。
Traceback (most recent call last): File "./b2.py", line 30, in <module> x = func2(10) └ <function func2 at 0x801b9e2f0> File "./b2.py", line 28, in func2 return func1(x)*2 │ └ 10 └ <function func1 at 0x8006dcbf8> File "./b2.py", line 24, in func1 a = c.doit(x) │ └ 10 └ <__main__.C object at 0x801b973c8> File "./b2.py", line 19, in doit a = x / 0 └ 10 ZeroDivisionError: division by zero
better_exceptions を使わない場合の例外エラーは以下の形になります。
Traceback (most recent call last): File "./b2.py", line 30, in <module> x = func2(10) File "./b2.py", line 28, in func2 return func1(x)*2 File "./b2.py", line 24, in func1 a = c.doit(x) File "./b2.py", line 19, in doit a = x / 0 ZeroDivisionError: division by zero
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12