スポンサーリンク

このドキュメントの内容は、以下の通りです。

はじめに


システム開発・プログラムの開発は、プログラムが止まったとき、エラーが起きたときに、戻り値を見て、エラーを出したり、例外をキャッチして、エラーを出したりするものです。何かエラーが起きた時に、どこまで行って、どういう理由で止まってしまった、エラーになったのか、といった細かい情報がないと、何が悪くて、どのように対処したらよいのかわからないものです。

以下のプログラムは、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

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

はてなの人気のブックマーク

スポンサーリンク
 

過去ログ

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

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー