1日ひとつだけ強くなる

おべんきょうのーと

Pythonで例外処理を書いてデバッグする

はじめに

gray hat pythonという本を写経しながらwindowsデバッガを作成しているのだが,その際にエラーが発生しているらしく,思うように処理が動かない.

直接エラーメッセージが出てないので見てみる,try exceptの部分でエラー隠蔽されているっぽいので,エラー発生時のログを見てみることにした。

try-except文とは

try文の中の処理を最初に実行し,もしエラーが発生するとexcept文の処理を実行する.

エラーが起きた時に処理を止めたくない時に有効だが,今回のようにエラーが発生してもどこでエラーが起きているのか隠蔽されて原因が見つかりにくくなる.

今回はtry-exceptでエラーをハンドリングせず実行しているので,エラーメッセージが表示されず,try文の中でエラーが発生し,except文の処理が実行されているのではと考えた.

エラーオブジェジェクトを受け取り,表示する.

本来は,発生するであろうエラーに備え,例外クラスをexceptに記載してやる必要がある.

しかし,発生するであろう例外を正しく予測しクラスを記述するのは僕みたいななんちゃってエンジニアには難しいので,何がエラーになっているのか確かめてやる方が良い.

Exceptionクラスを指定して,eという変数に例外オブジェクトを渡す.

# -*- coding:utf-8 -*-

try:
               # 実行したい処理

except Exception as e:
               # エラー発生時の処理
                print "[x] An Error has Occured."
                print "[x] Type: {type}".format(type=type(e))
                print "[x] Args: {args}".format(args=e.args)
                print "[x] Message: {message}".format(message=e.message)
                print "[x] Error: {error}".format(error=e)

実行してみると,AttributeErrorが吐き出されて変数のスペルミスだったことがわかった。

ツライ。

参考

いい機会なので例外処理について調べてまとめてみようと思ったが,参考にしたリンク貼っとけばいいやという甘え.

Pythonでtry exceptの書き方と、エラー内容の取得方法 - Symfoware 8. エラーと例外 — Python 2.7.x ドキュメント

補足

よく考えたらエラー出てるソースコードもないのにソースが〜〜〜とか書いてた. 紛らわしいので修正しました.

例外のprint文をstr.format関数を使って書き直した.