.net

【.net】例外のログはStackTraceよりToStringを使うべき理由

アプリケーションを開発していると、
例外発生時に、ログやコンソールにスタックトレースを出力したいというケースは多いと思います。

言語共通でスタックトレースといえば、
一般的に例外発生時のスタックをプリントするんだな、と認識できると思います。
僕は最初に何の迷いもなく、
Exception.StackTraceを使用してログ出力していました。
試しに0除算して例外を発生させてみます。

すると↓のような出力になります。

   場所 Otameshi.Form1.Calculation() 場所 {プロジェクトのパス}\Otameshi\Form1.cs:行 80
   場所 Otameshi.Form1.button1_Click(Object sender, EventArgs e) 場所 {プロジェクトのパス}\Otameshi\Form1.cs:行 50

んん?何の例外??
例外のクラス名も、メッセージもわからないではありませんか。




そうです。
.netのException.StackTraceは、
本当にスタックに入れた、ソースの呼び出し履歴しか出力してくれないのです。
メソッドではなく、プロパティだからということもありますが。

JavaのException.printStackTrace()の場合、
基本的に必要な情報はすべて出してくれますが、
.netの場合そうはいきません。

ではわざわざ、.Messageや.StackTraceなどすべて取得する必要があるのか?

いいえ、ちゃんと用意されています。
.netの場合は、Exception.ToStringで
JavaのprintStackTrace相当の内容が出力できます。

ToString()での出力↓

System.DivideByZeroException: 0 で除算しようとしました。
   場所 Otameshi.Form1.Calculation() 場所 {プロジェクトのパス}\Otameshi\Form1.cs:行 79
   場所 Otameshi.Form1.button2_Click(Object sender, EventArgs e) 場所 {プロジェクトのパス}\Otameshi\Form1.cs:行 62

欲しかったのはこれです。
なぜ、ToStringでないと取れないのかわかりませんが、
欲しい情報は取れました。

StackTraceとToStringの違いは↓の通りです。

項目名 StackTrace ToString
現在の例外をスローしたクラス名 ×
Message ×
内部例外でのToStringの呼び出し結果 ×
Environment.StackTraceの呼び出し結果

Messageはともかく、
「現在の例外をスローしたクラス名」はStackTraceに出ても良いような気がするのですがね。。。

確かにStackTraceはプロパティ、ToStringはメソッドなので、
StackTraceにMessageなどを含めるのは違う気がしますが、
「ToString」というメソッド名では、パッと見何が取れるかわかり難い気がします。

以上、StackTraceよりToString()を使用するべきの検証でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です