我将在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 :(得分:1)
我该如何解决这个问题?
当给定模块没有.pdb时,堆栈跟踪信息必然不能包含文件名,行号或列号。
要获得它们,您需要确保.NET .pdb可用并加载。有许多资源可用于描述如何执行此操作。例如,请参阅Cannot step into .NET framework source code或Advanced .NET Debugging - PDBs and Symbol Stores。您可以使用自己喜欢的网络搜索引擎来查找其他资源。
我还要注意您将类型名称描述为“FormName”,这是不正确的。事实上,当您的表单抛出异常时,它只是表单名称。未处理的异常总是错误,因此通常会被框架或其他库代码抛出,并且类型不会是表单。
我还要提到,捕获所有异常仅对诊断错误有用。这不应该用于尝试提高程序的一般可靠性(除非更好的诊断可以允许您修复错误)。当发生未处理的异常时,您应该记录它然后终止该进程。允许进程在发生未处理的异常后继续执行对您的数据是危险的,并且可能导致对错误修复的自满。