2

下面,为什么不Throw维护我的原始行号?
如果我运行 DerivedPage,我的日志文件将错误列为第 7 行。
不应该说第 4 行吗?如果我有,那将是有道理的Throw ex,但我没有。
本身不是Throw应该重新抛出错误并冒泡吗?

如果我Try...Catch在 DerivedPage 中完全删除该块,那么我的日志文件会正确地将 3 列为错误行,但如果出现错误,我将无法记录任何信息。

我可以做些什么来维护我的 DerivedPage,并且仍然让我的日志保持正确的行号?

Public Class DerivedPage Inherits BasePage
 Page_Load(o,e)
   Try
      Dim a = 3 -"a"
   Catch ex As Exception
      log.Info(...)
      Throw
   End Try
End Class

基本页面:

Public Class BasePage
 Protected Overrides Sub OnError(e)
   MyBase.OnError(e)
   log.Error(Me.GetType(), Server.GetLastError)
 End Sub
End Class

编辑log.Error如果存在则输出 InnerException。在这种情况下确实如此。但是,InnerException 的堆栈跟踪不包含行号,仅包含异常详细信息。

4

3 回答 3

0

重新抛出异常时,原始异常详细信息存储在对象的 InnerException 属性中。您应该在那里拥有所有详细信息。

于 2011-04-14T15:15:32.223 回答
0

您可以实现一种方法,该方法将在堆栈跟踪中为您提供正确的行号:

重新抛出异常并保留完整的调用堆栈跟踪 - Fabrice 的博客

代码是用 C# 编写的,但该PreserveStackTrace方法的代码应该相对容易移植到 VB.NET。

于 2011-04-14T15:15:39.693 回答
0

解决方案:堆栈跟踪上每个错误行号的两个解决方案是抛出一个以当前异常为内部的新异常,或者使用辅助方法。
我要抛出一个新的异常。

于 2011-04-14T15:57:28.593 回答