
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- その他(プログラミング・Web制作) VBAでパワーシェルを実行したいのですが、なかなかうまく出来ず、有識者の知識をお借りさせてください。 2 2024/05/11 00:25
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- その他(プログラミング・Web制作) 図に示す階層構造で,現在のディレクトリ(カレントディレクトリという)が*印のディレクトリであるとき, 2 2022/11/16 10:55
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Visual Basic(VBA) wordのマクロで思うように行きません(ファイル削除ができない) 3 2023/09/12 08:34
- Visual Basic(VBA) VBA一覧取得 再投稿 1 2024/05/25 12:28
- Excel(エクセル) 【マクロ】フォルダAからダBへファイルを、ファイルの更新日時の条件で、1つづつ移動するには? 3 2022/08/25 09:56
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
gccを行ってもexeファイルが生...
-
c言語
-
visual studio 2022でのC#プロ...
-
C# DatagridviewにExcelシート...
-
mallocについて
-
C言語って古いですか?
-
C言語関数違いについて。
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
パソコン
-
CPUが16bitでも32bitOSでコンパ...
-
Python、プログラミングについ...
-
だれがとけるの?
-
バッチファイルで以下のような...
-
Notepad++の関数リスト表示の変...
-
VisualStudio2022でC言語プログ...
-
License='MIT' ってなんでmitな...
-
C言語 ストリームについて。
-
c言語でイベントフラグを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報