在我负责的代码中,我有一些'抛出新的异常()'方法。
问题是,catch
并不总是在最佳位置,甚至不在同一个班级。这意味着当我发现错误时,我不知道throw
的起源,或者即使我这样做,每个类中也可能有数百/数千行代码。
因此,在throw
消息中,为了便于调试,可能需要说明类名,项目名称,方法名称和行号以便于导航。行号很棘手。我无法对其进行硬编码,因为只要我修改代码,它就不可能保持在同一条线上。
所以,我的两个问题是 1)我们喜欢这个想法还是不想,有更好的方法! 2)有关如何获取行号的任何想法吗?
答案 0 :(得分:2)
您是否考虑过查看System.Diagnostics下的StackTrace信息?可以在以下位置找到一个示例:
http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx
答案 1 :(得分:0)
如果您将调试符号(.pdb)文件包含在与.dll
或.exe
相同的目录中,则应自动加载它们并提供行号在exception.StackTrace
。
要构建符号,请在版本构建设置中的高级构建设置下,将调试信息转为完整强>
答案 2 :(得分:0)
查看System.Diagnostics.StackFrame
类以获取行号。我相信方法GetFileLineNumber
可以帮助你
http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe
答案 3 :(得分:0)
此信息通常在堆栈跟踪中提供 - 由Jeremy提供(请参阅我的评论)。
抱歉,不确定如何将评论标记为正确答案!?
答案 4 :(得分:0)
在发布模式下编译的代码中不会显示行号。如果这是一个内部应用程序,您和确实想要行号,您可以始终部署在调试模式下编译的代码,然后使用程序集部署PDB。但是这也涉及到性能成本,所以这并不总是最好的方法。不过,我不确定此时有什么更好的方法。
如果我没记错的话,Roslyn项目为我们提供了一个更好的方法来获取行号但不熟悉它以提供更多细节。
答案 5 :(得分: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.