C#:异常处理 - 查找错误

问题描述:

我有这样的代码:C#:异常处理 - 查找错误

private void btnNext_Click(object sender, RoutedEventArgs e){ 
    try 
     { 
     // Lots of codes in here 
     } 

    catch (Exception ex) 
     { 
     System.Windows.MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace.ToString()) 
     } 
    finally 
     {} 
} 

它捕获异常,但没有告诉我哪里有异常的代码里面出现。我唯一得到的是这个。

Object reference not set to an instance of an object 
    at ProjectPath.btnNext_Click(Object sender, RoutedEventArgs e) 

发布代码在很多机器上都能正常工作,但是在很少的机器上,它会抛出这个异常。我只是不知道在这些机器上运行时发生异常的代码的位置。有没有办法找到发生异常的确切行? ex.StackTrace没有完成工作。

任何帮助将不胜感激。

+1

不要捕获它并在调试器中运行它。它将停止抛出异常的位置。 (或者更好,告诉你的调试器停止捕获和未捕获的异常) –

+2

你可以在调试器下运行它吗?如果可以的话,只需打开让调试器中断引发异常的选项即可。 (菜单:调试|例外 - >打开“引发”为'公共语言运行时例外') –

+0

以较小的原子块重构代码 – Dhawalk

你应该最好在你认为会抛出异常的地方放置单独的try-catch块 - 而不是把所有的东西放在同一个地方。

否则,当您调试时,它会创建pdb文件 - 如果它们存在于执行文件的文件夹中,则可以获取行号。

这就是说,这个错误是很常见的,你有一个null的地方。

添加:在这里,我假设由于某种原因,您无法让调试器停止异常,和/或无法追踪它,因为您将它部署到第三方或其他东西。

+0

是的,不能使用调试器,因为它是一个已部署的解决方案。 – Butters

+0

使用单独的try catch块并找出它的位置。 – Butters

要找到确切的位置 - 源代码中的特定行 - 它有助于在调试器中运行代码并在异常处理程序中设置断点。

如果您检查作为异常处理程序参数引用的数据结构(示例中为ex),则会找到名为StackTrace的数据成员。如果位置在任何地方,它将在这里。在这里,例如,我正在处理异常的字符串的方式如下:

at DOffice.BrMan.getLastReportRefreshed() in E:\\src\\BrMan.cs:line 5370 
at DOffice.BrParms.lookupParmByParmName(String parmName) in E:\\src\\BrParms.cs:line 169 
at DOffice.BrMan.populateAllFromTextFile(String workDirectory) in E:\\src\\BrMan.cs:line 3218 
at DOffice.BrMan.setWorkPath(String pathOfCurrentDoc) in E:\\src\\BrMan.cs:line 1686 
at DOffice.Form_Dash.InitWork(Object sender) in E:\\src\\Form_Dash.cs:line 1261