0

我有这个代码:

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没有完成工作。

任何帮助将不胜感激。

4

2 回答 2

2

理想情况下,您应该在您认为会引发异常的区域周围放置单独的 try-catch 块 - 而不是将所有内容放在同一个区域中。

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

也就是说,这个错误很常见,你在某处有一个空值。

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

于 2013-03-28T21:30:00.863 回答
1

要找到确切的位置——源代码中的特定行——如果您在调试器中运行代码并在异常处理程序中设置断点,这会有所帮助。

如果您检查作为异常处理程序参数引用的数据结构(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
于 2015-01-06T19:14:37.133 回答