例外が発生した?それは良いことだ。スタックトレースの中に飛び込もう

公開日:2018-12-07
最終更新:2018-12-07

原因を突き止めてから対策を考える。こうして書くと当然のことのように思えるけど、デバッグをしていると往々にして、原因を突き止めないまま対策を考えている自分に気付く。

たとえば、架空の日付クラスに関するテスト

const today = new Date(2018, 11, 23);  
const tommorow = today.nextDay(); // 翌日の日付インスタンスを作成  
const { day } = tommorow;  
expect(day).toEqual(24);  

が次のように失敗するとしよう。

Test failed: expected date to equal 24; instead received 23.  

こういうとき、つい小手先の対処療法を探したくなってしまう。たとえば、関数呼び出しにちょっとしたオプションを追加するとか:

const today = new Date(2018, 11, 23, { noTimezone: true });  

でも、本当に見るべきなのはnextDate()や、nextDate()が呼び出しているであろうDateコンストラクタの中を流れていくデータなんだ。nextDate()Dateコンストラクタに渡している値は何か?それらは正しいと考えられる値か?もし正しい値を渡しているなら、Dateコンストラクタはthisに変数を正しくセットしているか?そういうことを見るべきなんだ。大切なのは生のデータ。表面から見える挙動で色々なことを判断してはならない。

コードの森に足を踏み入れるという行為は、それなりの労力を必要とする。それが、自分が書いたのではないライブラリのコードならなおさらのことだ。だから、外側のAPIだけをいじって楽をしたくなるのはある意味当然のことだ。けれどそれは偶然、何かの拍子に問題が解決することを期待しているだけであって、ぜんぜん本質的ではない。上の例のように手当たり次第にパラメタを変えても、解決につながることは稀だ。

一方で、データの流れを追っていけば、確実に核心に迫っていくことができる。データの流れを追う時は、二分探索的にデータがおかしくなる点を探す。ある時点では期待通りだったデータが、その後の別の時点では期待とは違うものになっている。そういう2つの時点を発見したら、その間のどこかの時点で、もう一度データを採取する。その繰り返しだ。自分の書いたコードならこの方法でほとんど確実におかしい点を見つけられる。途中でライブラリのコードに入ってしまう場合は、追跡のコストがいくぶん上がるので、追跡を諦めることもあるかもしれない。そうした場合でも、できるところまで追跡を行うことで、少なくとも小手先で外側のAPIをいじくった場合よりは解決策が見えやすくなることが多い。

データを直接確認すること。頭では分かっていても、実際にコードを書いている時は楽をしたい誘惑にかられるので、これを実行するのは意外に難しいことだ。強い意志をもつしかない。

最後に、ぴったりな言葉があるので紹介したい。

抱えた重荷を聖なる静寂へと葬り去ってはならない。問題を抱えている? それは良いことだ。喜び、飛び込み、調べよう。"
-- Ven. Henepola Gunaratana

これは Dive Into Python 3 からの股引きだ。喜び、飛び込み、調べよう。デバッグに関してこれほどためになる言葉はないのではないだろうか。

例外が発生した?それは良いことだ。スタックトレースの中に飛び込もう。

記事が少しでもいいなと思ったらクラップを送ってみよう!
18
+1
@yukiuの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする