C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: 例外処理のスタックトレースについて


(過去ログ 62 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■35887 / inTopicNo.1)  例外処理のスタックトレースについて
  
□投稿者/ 例外 (1回)-(2009/05/15(Fri) 10:54:10)

分類:[C#] 

お世話になります。

環境 [ C# 2.0 ]

try〜catchで、Exceptionを発生した際のスタックトレースなんですが、
この内部のSystem名前空間のトレースを取り除くことは可能なんでしょうか?

うまく伝えられないですが、以下に例を示します。

場所 System.Windows.Forms.Control.OnClick(EventArgs e)
場所 System.Windows.Forms.Button.OnClick(EventArgs e)
場所 System.Windows.Forms.Button.PerformClick()

↑を取り除き、

場所 WindowsApplication1.Form1.SecondMethod() 場所 C:\test\Form1.cs:行 37
場所 WindowsApplication1.Form1.FirstMethod() 場所 C:\test\Form1.cs:行 26
場所 WindowsApplication1.Form1.button1_Click(Object sender, EventArgs e) 場所 C:\test\Form1.cs:行 21

↑だけを取得したいのです。

よろしくお願いします。
引用返信 編集キー/
■35889 / inTopicNo.2)  Re[1]: 例外処理のスタックトレースについて
□投稿者/ ぽぴ王子 (438回)-(2009/05/15(Fri) 11:05:56)
ぽぴ王子 さんの Web サイト
No35887 (例外 さん) に返信
> お世話になります。
> 
> 環境 [ C# 2.0 ]
> 
> try〜catchで、Exceptionを発生した際のスタックトレースなんですが、
> この内部のSystem名前空間のトレースを取り除くことは可能なんでしょうか?
> 
> うまく伝えられないですが、以下に例を示します。
> 
>    場所 System.Windows.Forms.Control.OnClick(EventArgs e)
>    場所 System.Windows.Forms.Button.OnClick(EventArgs e)
>    場所 System.Windows.Forms.Button.PerformClick()
> 
> ↑を取り除き、
> 
>    場所 WindowsApplication1.Form1.SecondMethod() 場所 C:\test\Form1.cs:行 37
>    場所 WindowsApplication1.Form1.FirstMethod() 場所 C:\test\Form1.cs:行 26
>    場所 WindowsApplication1.Form1.button1_Click(Object sender, EventArgs e) 場所 C:\test\Form1.cs:行 21
> 
> ↑だけを取得したいのです。
> 
> よろしくお願いします。

できるかどうかで言えば、スタックトレースなんて文字列なんだから、その中から System. を含む行を
削除すれば目的に一致したものが取れると思います。

その前に、なぜそういうことをしたいのかを書いておいた方がいいと思います。
自分のアプリケーションで発生した部分のみ知りたいのかもしれないと思いましたが、だとしても見て判断
すれば良いだけのような気もするので、その理由がよくわからないです。
ただ他にも有効な方法があるかもしれませんので、単にやり方を聞くよりは「こういうことがしたいのだが
こういう方法を取るにはどうすれば?」的な質問の方がいいのではないでしょうか。

引用返信 編集キー/
■35898 / inTopicNo.3)  Re[2]: 例外処理のスタックトレースについて
□投稿者/ 例外 (2回)-(2009/05/15(Fri) 12:58:52)
ご返事ありがとうございます。

> その前に、なぜそういうことをしたいのかを書いておいた方がいいと思います。
> 自分のアプリケーションで発生した部分のみ知りたいのかもしれないと思いましたが、だとしても見て判断
> すれば良いだけのような気もするので、その理由がよくわからないです。
> ただ他にも有効な方法があるかもしれませんので、単にやり方を聞くよりは「こういうことがしたいのだが
> こういう方法を取るにはどうすれば?」的な質問の方がいいのではないでしょうか。

失礼しました。
実は、開発者の方からスタックトレースのログが長いというクレームから、
System名前空間のトレースログはいらないという決断が下ったわけですが、
おっしゃる通り、見て判断すれば済む話です。
ですが、ちょっと興味がわいて調べている最中なんです。

例えば、スタックトレースの出力レベル的なものがあって、
そのレベルを設定することで、「フレームワーク側のトレースは含めない」みたいなことを
想像しておりました。

やはり、文字列を分解する方法しかないのでしょうか?
引用返信 編集キー/
■35899 / inTopicNo.4)  Re[3]: 例外処理のスタックトレースについて
□投稿者/ みきぬ (428回)-(2009/05/15(Fri) 13:03:03)
# ちゃちゃ

> System名前空間のトレースログはいらない

普段はいらないと思っていても、それを捨てた途端に必要になってしまうことってあるよね。
引用返信 編集キー/
■35905 / inTopicNo.5)  Re[4]: 例外処理のスタックトレースについて
□投稿者/ 例外 (3回)-(2009/05/15(Fri) 13:27:03)
> 普段はいらないと思っていても、それを捨てた途端に必要になってしまうことってあるよね。

全員が全員いらないと言ってるわけではないので、
もちろん、切り替えはできるようにします。
少なくとも、私は必要だと思ってますよ。
イベントの順番も分かりますし。
引用返信 編集キー/
■35907 / inTopicNo.6)  Re[5]: 例外処理のスタックトレースについて
□投稿者/ やじゅ (1000回)-(2009/05/15(Fri) 13:43:13)
やじゅ さんの Web サイト
No35905 (例外 さん) に返信

正規表現で、先頭が"場所 System."で行末までを空文字で置換すれば
除去できますね。

正規表現が苦手なので、書けないけど・・・
引用返信 編集キー/
■35909 / inTopicNo.7)  Re[3]: 例外処理のスタックトレースについて
□投稿者/ επιστημη (1934回)-(2009/05/15(Fri) 13:53:02)
επιστημη さんの Web サイト
> やはり、文字列を分解する方法しかないのでしょうか?

おそらく一番簡単ですよ?

static void Main() {
    try {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    } catch (Exception ex) {
        List<string> msgs = new List<string>();
        foreach (string line in ex.ToString().Split(new char[] { '\n' })) {
            if (!line.Contains("System.")) msgs.Add(line);
        }
        MessageBox.Show(string.Join("\n", msgs.ToArray()));
    }
}

引用返信 編集キー/
■35911 / inTopicNo.8)  Re[4]: 例外処理のスタックトレースについて
□投稿者/ なちゃ (282回)-(2009/05/15(Fri) 14:10:55)
Systemという文字列を含む名前空間やクラス名やメソッド名を使ってたらアウトですぜ
引用返信 編集キー/
■35912 / inTopicNo.9)  Re[5]: 例外処理のスタックトレースについて
□投稿者/ なちゃ (283回)-(2009/05/15(Fri) 14:12:51)
デバッグ情報ありなら、ソースをSystemという文字列を含むパスに置いててもアウトですぜ。

引用返信 編集キー/
■35913 / inTopicNo.10)  Re[6]: 例外処理のスタックトレースについて
□投稿者/ επιστημη (1935回)-(2009/05/15(Fri) 14:19:21)
επιστημη さんの Web サイト
> Systemという文字列を含む名前空間やクラス名やメソッド名を使ってたらアウトですぜ
> デバッグ情報ありなら、ソースをSystemという文字列を含むパスに置いててもアウトですぜ。

アタマに空白いっこ足してline.Contains(" System.") とでもしときゃいんぢゃね?

引用返信 編集キー/
■35915 / inTopicNo.11)  Re[7]: 例外処理のスタックトレースについて
□投稿者/ aetos (142回)-(2009/05/15(Fri) 14:55:13)
No35913 (επιστημη さん) に返信
>>Systemという文字列を含む名前空間やクラス名やメソッド名を使ってたらアウトですぜ
>>デバッグ情報ありなら、ソースをSystemという文字列を含むパスに置いててもアウトですぜ。
>
> アタマに空白いっこ足してline.Contains(" System.") とでもしときゃいんぢゃね?
>

Microsoft.〜 は?
その他にも使ってるライブラリがあればそれも?
引用返信 編集キー/
■35926 / inTopicNo.12)  Re[8]: 例外処理のスタックトレースについて
□投稿者/ 例外 (4回)-(2009/05/15(Fri) 17:20:48)
皆さんご回答ありがとうございます。
スタックトレースの分解で挑みます。

No35913 (επιστημη さん) に返信
>アタマに空白いっこ足してline.Contains(" System.") とでもしときゃいんぢゃね?
こんな(Contains)メソッドあったのですね。(2.0から追加か)
私の頭はIndexOf止まりでした。勉強になります。

No35915 (aetos さん) に返信
> Microsoft.〜 は?
> その他にも使ってるライブラリがあればそれも?
その辺りは開発者に決めさせようと思います。キリがないので。

仕様としては、クライアント毎に指定の名前空間(先頭から)を決めさせ、
その名前空間行(先頭が"場所 XXXXXX.XXXX")は表示させないようにしようと思います。

※既に使われなくなる機能になる予感はしてますが。。。
ありがとうございました。
解決済み
引用返信 編集キー/
■35935 / inTopicNo.13)  Re[9]: 例外処理のスタックトレースについて
□投稿者/ Azulean (372回)-(2009/05/15(Fri) 22:54:37)
下記のようなスタックフレームだったらどうするんだろうか?
(1)の部分だけ取り出されるイメージなんだろうかなぁ。

 自分のプロジェクトのコード(1)
 System名前空間のコード(2)
 自分のプロジェクトのコード(3)
 System名前空間のコード(4)

大抵の場合は(1)だけで事足りるかもしれませんが、再現が難しい不具合だった場合、一部だけ削り取ったログ等を出力していると、必要な情報が抜け落ちてたというトラップに陥るかもしれません。
個人的にはログの出力はなるべく多くして、表示にフィルタをかけるスタンスの方が、後悔しなくて済むかなぁと思っています。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -