【问题标题】:Get Specific information from thrown exception从抛出的异常中获取特定信息
【发布时间】:2020-04-06 01:32:13
【问题描述】:

假设我们在代码中抛出了一个异常 ex。现在在 catch 正文中,我想访问六条信息:

  1. 解决方案名称
  2. 项目名称
  3. 命名空间名称
  4. 文件名
  5. 方法名称
  6. 行号

我已经知道的是使用

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


【解决方案1】:

您很可能不会得到完全符合您要求的东西,但我将分享一些您可能不知道或未考虑过的工具和想法:

  1. 有一些属性(CallerFilePathAttributeCallerLineNumberAttributeCallerMemberNameAttribute,当添加到可选方法参数时,将导致编译器根据正在编译的代码的上下文自动插入默认值。您可以创建一个具有此类属性的辅助方法来捕获您想要的信息。
  2. 有像 Fody 这样的工具,被称为“IL Weavers”,可以在主编译过程之后运行,并以特定方式更改编译后的代码。例如,您的代码可以编写为对一个方法进行简单调用,但在编译时,编织器可以更改代码以创建一堆上下文信息并将其传递给日志记录方法。
  3. 如果您的代码组织得很好,您通常可以确保命名空间、类和方法(它们都作为堆栈跟踪的一部分被捕获)是您可以猜测解决方案、项目和文件的足够信息姓名。
  4. 当您捕获异常时,您通常希望记录发生的事情并以特定方式处理异常,或者只是将异常包装在具有更多上下文信息的另一个异常中。如果选择后者,则命名空间、类和方法名称将包含在引发异常的堆栈跟踪中。因此,当它在堆栈中进一步记录时,您将可以访问该数据。

【讨论】:

    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多