StackTrace

投稿日:2007年08月20日 作成者:yasunaka

Javaで組んだプログラムの場合、実行中に例外が発生したときに適切に処理していると、プログラムを中断することなしに簡単にStackTraceを見ることができます。私がJavaを使い出したときに、非常に良いなと思った仕組みのひとつが、この例外処理の仕組みです。Javaに限らずに、既に他の言語でもあったのかもしれませんが、少なくとも私がそのときまでやってきたC/C++の世界にはなかった仕組みでした。

もう10年以上も前の話ですが、金融商品の理論価格をリアルタイムで計算するシステムを開発したことがありました。UNIXマシン+C言語で計算エンジン(今でいうアプリケーションサーバ)を開発し、LAN上のPCに計算結果を配信するような仕組みです。計算ロジックにはだいぶ複雑な計算モデルが使われていました。

こいつは日中マーケットが動いている間、計算をし続けるのですが、複雑な仕組みを用いているがために、たまにバグのためにメモリアクセスエラーで落ちる(止まる)ことがありました。当然のことですが、落ちると大変です。いつどこにいても呼び出されて対応に追われることになります。このシステムを担当している間は、マーケットの開いている時間帯は気の休まることがありませんでした。

さらに、メモリアクセスエラーが発生すると作成されるcoreファイルを元に解析するのですが、この解析が大変です、strip(リンク時に使ったシンボル情報を消すこと)していたりすると、もうお手上げ、ほぼ解析不能になってしまいます。

Javaで本格的なシステムを作り始めたのはJDK1.1の時代(1998年頃)からになります。その当時、24時間動き続けるサーバサイドのアプリケーションを作ったことがあったのですが、Javaの例外処理の仕組の恩恵を十分に受けました。まず例外が発生してもアプリケーションがストップしないように作ることができます。さらに不具合時の状態をStackTraceとして簡単に見ることができる。問題のかなりの割合がこのStackTraceを見るだけで一目瞭然に原因がわかってしまいます。おかげでアプリケーションの品質を上げる作業が非常にやりやすかったのです。実際これらの仕組みのおかげで、その当時、何ヶ月もの間ノンストップで動き続けるアプリケーションを作れたときに、Javaってすごい、と感じました。

さて、現代のJavaプログラミングの鉄則のひとつに、例外を握りつぶすな、という言葉があります。なぜ重要かわかりますよね。握りつぶしてしまうということ、イコール、起こっている問題から目を背けるという行為です。これをやってしまうと、アプリケーションをきちんとした品質にするのに余計に大変な思いをすることになるのです。せっかくの優れた仕組みなのですから、最大限、その恩恵に預かりましょう。