2016-08-13 4 views
0

私はWinformsアプリケーションですべての未処理の例外をキャッチします。すべての未処理の例外をキャッチ

[STAThread] 
static void Main() 
{ 
    if (!AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe")) 
    { 
     Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod); 
    } 

    Application.Run(new frmLogin()); 
} 

private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t) 
{ 
    Exception ex = t.Exception; 
    StackTrace trace = new StackTrace(ex, true); 

    var db = new MyDataContext(); 

    Error error = new Error(); 
    error.FormName = trace.GetFrame(0).GetMethod().ReflectedType.FullName; 
    error.LineNumber = trace.GetFrame(0).GetFileLineNumber(); 
    error.ColumnNumber = trace.GetFrame(0).GetFileColumnNumber(); 
    error.Message = ex.Message; 

    db.Errors.InsertOnSubmit(error); 
    db.SubmitChanges(); 

    if (new frmError(ex).ShowDialog() != DialogResult.Yes) 
     System.Diagnostics.Process.GetCurrentProcess().Kill(); 
} 

問題は、FormName、LineNumber、ColumnNumberが正しく返されないことがあることです。ここで私は時々得るという結果は次のとおりです。

--FormName--   --Line/Column-- --Message-- 
System.Linq.Enumerable  0 0 Sequence contains no matching element 
System.RuntimeMethodHandle 0 0 Exception has been thrown by the target of an invocation. 
System.Number    0 0 Input string was not in a correct format. 
System.Number    0 0 Input string was not in a correct format. 
System.ThrowHelper   0 0 Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 

あなたが見ることができるように、LineNumbersとColumnNumbersが0 FORMNAMEがSystem.Linq.Enumerableである...

はどのように問題を解決することができますか?

+0

フォームの名前が "System.Linq.Enumerable"ではありません。 0以外の行番号があると仮定すると、その情報で次に何をしますか? System.Linq用の正しいPDBファイルがある場合でも、行番号を含むPDBファイルはありません。独自のプロジェクトと同じように、.NETアセンブリのビルド設定は「pdbのみ」です。アプリのリリースビルドをテストしてください。 –

答えて

1

どうすれば問題を解決できますか?

特定のモジュールに.pdbが存在しない場合、スタックトレース情報には必ずファイル名、行番号、または列番号を含めることができません。

これらを取得するには、.NET .pdbが使用可能であり、ロードされていることを確認する必要があります。これを行う方法を説明する利用可能なリソースがいくつかあります。たとえば、Cannot step into .NET framework source code、またはAdvanced .NET Debugging - PDBs and Symbol Storesを参照してください。お気に入りのWeb検索エンジンを使用して、追加のリソースを見つけることができます。

タイプ名を「FormName」と記述していることにも注意してください。これは間違っています。例外がフォームによって実際にスローされたのは、フォーム名だけです。未処理例外は常にバグであり、フレームワークや他のライブラリコードによって投げられることが多く、型はフォームではありません。

また、すべての例外をキャッチすることは、バグの診断にのみ役立つことにも言及します。これは、プログラムの一般的な信頼性を向上させる試みとして使用するべきではありません(より良い診断があなたにバグを修正させることを許す範囲を除く)。未処理の例外が発生した場合は、ログに記録してからプロセスを終了する必要があります。未処理の例外が発生した後もプロセスの実行を継続できるようにすると、データが危険になり、バグ修正に関する自信が生じます。