1

在我负责的代码中,我有一些“抛出新异常()”方法飞来飞去。

问题是,catch它并不总是在最好的地方,甚至在同一个班级里。这意味着当我发现错误时,我不知道throw起源于哪里,或者即使我知道,每个类中可能有成百上千行代码。

因此,在throw消息中,为了便于调试,说明类名称、项目名称、方法名称和行号可能很有用,以便于导航。行号很棘手。我无法对其进行硬编码,因为一旦我修改了代码,它就不太可能保持在同一行。

所以,我的 2 个问题是
1)我们喜欢这个想法还是不认为,有更好的方法!
2)任何想法如何获得行号?

4

6 回答 6

2

您是否考虑过查看 System.Diagnostics 下的 StackTrace 信息?可以在以下位置找到一个示例:

http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

于 2012-06-07T14:58:26.490 回答
0

如果包含调试符号 (.pdb).dll文件,与or位于同一目录中.exe,它应该会自动加载它们并在exception.StackTrace.

要构建符号,在您的发布构建设置中,在Advanced Build Settings下,将Debug Info设置为Full

高级构建设置

于 2012-06-07T14:56:33.620 回答
0

查看System.Diagnostics.StackFrame获取行号的类。我相信这个方法GetFileLineNumber可以帮助你

http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe

于 2012-06-07T15:03:46.137 回答
0

此信息通常在堆栈跟踪中可用 - 由 Jeremy 提供(请参阅我的评论)。

抱歉,不知道如何将评论标记为正确答案!?

于 2012-06-07T15:05:50.437 回答
0

行号不会显示在以发布模式编译的代码中。如果这是一个内部应用程序,并且您真的想要行号,您总是可以部署在调试模式下编译的代码,然后使用程序集部署 PDB。但这也涉及性能成本,因此这并不总是最好的方法。不过,目前我不确定是否有更好的方法。

如果我没记错的话,Roslyn 项目为我们提供了一种更好的获取行号的方法,但对它不够熟悉,无法提供更多细节。

于 2012-06-07T15:08:48.747 回答
0

您可以使用 C# 5.0 功能结合默认参数来捕获调用者的行号。因此,不要直接构造和抛出异常,而是创建一个构造异常的方法。

Exception CreateMyException(
    [CallerFilePath] string filePath = "", 
    [CallerMemberName] string memberName = "",
    [CallerLineNumber] int lineNumber = 0)
{
   return new Exception(string.Format("Exception thrown from line {0} in member {1} in file {2}",
       lineNumber, memberName, filePath));
}

...在您的代码中的其他地方...

throw CreateMyException();  // compiler injects current values for defaulted arguments.
于 2012-06-08T19:01:15.657 回答