【发布时间】:2020-04-06 01:32:13
【问题描述】:
假设我们在代码中抛出了一个异常 ex。现在在 catch 正文中,我想访问六条信息:
- 解决方案名称
- 项目名称
- 命名空间名称
- 文件名
- 方法名称
- 行号
我已经知道的是使用
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(e, true);
我可以访问其中的一些信息(文件的完整路径、行号等)。但这些信息仍然不是我所需要的。例如,我不知道如何从跟踪中提取解决方案名称或命名空间名称。显然解析文件的路径也不是一种选择,因为不同的错误可能有多层文件和文件夹层次结构,并且一个全局规则不适用于所有错误。
我想知道有没有办法以编程方式访问这些信息?
非常感谢。
【问题讨论】:
-
诸如“解决方案”和“项目”之类的东西只是编译时的概念(特定于 Visual Studio,甚至——编译器不需要以这种方式对代码进行分区)。它们不会反映在二进制文件或调试符号中,因此不适用于运行时。您可以使用属性和/或生成的代码将它们显式嵌入到程序集中,但您仍然必须处理它们不可用的情况。命名空间虽然不能立即在堆栈帧中可用,但可以从方法所在类型的名称(
.GetMethod().ReflectedType.Namespace)中确定。 -
ex.ToString() 是您可以从中获得的最大信息量。正如@JeroenMostert 所说,解决方案和项目只是编译器的事情。甚至是 Visual Studio 唯一的东西。然而,这也应该很明显,因为命名空间/函数名称在堆栈跟踪中,你应该知道程序在调试它之前抛出异常。
-
有两篇关于异常处理的文章我经常链接,这可能会帮助您弄清楚该怎么做:blogs.msdn.microsoft.com/ericlippert/2008/09/10/… | codeproject.com/Articles/9538/…
-
您想要获得您列出的有关最初引发异常的点或捕获异常的点的信息吗?
-
我想从最初抛出异常的地方获取信息。
标签: c# .net exception stack-trace system.diagnostics