
C#で、以下のような処理が入ってる書いたプログラムソースがあります
(省略)
try
{
(省略)
}
catch(Exception ex)
{
MessageBox.Show("失敗");
using (StreamWriter js = new StreamWriter($"error.log", true))
{
js.Write(DateTime.Now.ToString("g") + ex.ToString() + "\n");
}
return;
}
(省略)
VisualStudioでリリースビルドしたexeファイルを他の人のPC上で実行させて、この処理が動いた際、error.logに以下が書き込まれてました
2024/06/01 11:50 省略
~ Button_Click(Object sender, RoutedEventArgs e) in
C:\work\001\002\code\Tool\Tool\OutPut.xaml.cs:line 1512
error.log
に出てきたファイルパスは、自分がこのプログラムを作成した時のファイルパスだと思います
どのファイルがどの行でエラー出したかが分かりやすくて良いのですが、作成時のファイルパスが入ってるのがなんか嫌です
これって ex.ToString()
の処理で書き込まれた部分ですが、ファイルパスは出さないようにできますか?
No.5ベストアンサー
- 回答日時:
できません。
コンパイル時のデバッグシンボルなので、一般的にはリリースコンパイル時にデバッグシンボルは含めないことがほとんどです。
よほど本番環境でバカスカエラーを吐くような質の悪いものを提供しているような環境なら別でしょうけど。
その場合、色々な作業をする上でエンドユーザー名でフォルダ分けとかしてると思いますが、あまりパス情報に個人のローカルアカウント名やエンドユーザー名とか入れたくありませんよね。
想定外のエラーを捕捉してエラーログを出力するなら、デバッグシンボルによるスタックトレースに頼るのではなく、それ相応の操作されたリクエストログなどを出力するのがよいかと思います。
どうしてもデバッグシンボルからのスタックトレースで出力したいなら、
自前でちょっと加工するしかありませんね。
テキトーに作りましたが、下記の例だと、例外クラスの拡張メソッドを用意してそれを利用することで、簡素的にパス情報を除去します。
コンパイル時のソシューションパス情報は分からないため全部除去します。
そのため、どのフォルダ構成上にあるファイルなのかは分かりません。
js.Write(DateTime.Now.ToString("g") + ex.ToStringWithoutCompiledPath() + "\n");
public static class ExceptionExtension
{
private static readonly Regex FilePathRegex = new Regex(@"(?<=in )(.+)(?=\\.+\.(cs|vb):)", RegexOptions.Compiled);
public static string ToStringWithoutCompiledPath(this Exception exception)
{
var sb = new StringBuilder($"{exception.GetType().FullName}: {exception.Message}{Environment.NewLine}");
if (exception.StackTrace != null)
{
sb.Append(FilePathRegex.Replace(exception.StackTrace, ""));
}
return sb.ToString();
}
}
No.6
- 回答日時:
No2の方のアドバイスに従い、Exception.ToString() で得られた文字列から
C:\work\001\002\code\Tool\Tool\ を削除するようにしました。
以下のようになります。
catch(Exception ex)
{
MessageBox.Show("失敗");
using (StreamWriter js = new StreamWriter($"error.log", true))
{
//変更開始
string msg = ex.ToString();
msg = msg.Replace(@"C:\work\001\002\code\Tool\Tool\", @"");
js.Write(DateTime.Now.ToString("g") + msg + "\n");
//変更終了
}
return;
}
No.4
- 回答日時:
デバッグ情報(*.pdb)を消せば簡単に消えますが、客先で起きた
不具合の解析が非常に困難になります。
ファイルの構成がバレるより1億倍困ります。
私なら決して消しません。消すやつがいたら殴って叩き出します(^^;
現場の人間が途方にくれないようにしましょう。
#昔ファイル名や識別子にプロレスラーの名前を付けるやつがいましたが
#その類でしょうか? あれは恥ずかしいです(^^;
No.3
- 回答日時:
その情報はデバッグ情報が有効な場合に出ます
他の人に渡す場合はデバッグ情報を除いてコード生成しましょう
https://learn.microsoft.com/ja-jp/dotnet/api/sys …
> 呼び出した Environment.StackTrace 結果が取得
https://learn.microsoft.com/ja-jp/dotnet/api/sys …
> at FullClassName.MethodName(MethodParams) in FileName:LineNumber
> デバッグシンボルが使用できない場合は in で始まる部分文字列全体が省略
https://learn.microsoft.com/ja-jp/dotnet/csharp/ …
> -debug: デバッグ情報を生成します (または生成しません)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#include <Windows.h>というヘ...
-
.NETアプリを作ったときの .man...
-
アクセス 壊れた? 「ファイ...
-
コマンドプロンプトで作成日時...
-
jarファイル
-
binファイルを解凍したいの...
-
C言語---ファイルに出力したデ...
-
バッチ処理で追記コピーしたい
-
Latexで図番号だけを「図1.1」...
-
CRCが一致する確率
-
リンクの張り付けかたを教えて...
-
監視ツールを入れさせられまし...
-
ストレージにある全てのファイ...
-
bibtexで参考文献作成できない
-
VBSが起動しない
-
Oracleの使い方がわかりません
-
frm、frxファイル
-
ファイル名にドットを使ったフ...
-
Seasar2のdiconファイルの読み方
-
VBA zipファイルの作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
binファイルを解凍したいの...
-
アクセス 壊れた? 「ファイ...
-
コマンドプロンプトで作成日時...
-
#include <Windows.h>というヘ...
-
Latexで図番号だけを「図1.1」...
-
リンクの張り付けかたを教えて...
-
.NETアプリを作ったときの .man...
-
jarファイル
-
コマンドプロンプトで、指定し...
-
「営業秘密の漏洩」について
-
自分で作成した重要ファイルを...
-
公文書のxmlファイルの開き方が...
-
warファイルをEclipseでプロジ...
-
ストレージにある全てのファイ...
-
C言語---ファイルに出力したデ...
-
ファイルが開かれているかどう...
-
HTMLからのBATファイル実行
-
監視ツールを入れさせられまし...
-
「ブルーファイル」と「グリー...
-
バッチ処理で追記コピーしたい
おすすめ情報