C# 从抛出的异常获取特定信息 让我们考虑在代码中有一个异常EX。现在在catch body中,我想获得六条信息: 解决方案名称 项目名称 名称空间名称 文件名 方法名 行号

C# 从抛出的异常获取特定信息 让我们考虑在代码中有一个异常EX。现在在catch body中,我想获得六条信息: 解决方案名称 项目名称 名称空间名称 文件名 方法名 行号,c#,.net,exception,stack-trace,system.diagnostics,C#,.net,Exception,Stack Trace,System.diagnostics,我已经知道的是使用 System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(e, true); 我可以访问其中一些信息(文件的完整路径、行号等)。但这些信息并不是我所需要的全部。例如,我不知道如何从跟踪中提取解决方案名称或命名空间名称。显然,解析文件路径也不是一个选项,因为不同的错误可能有多个文件和文件夹层次结构层,并且一个全局规则并不适用于所有错误 我想知道有没有办法通过编程方式访问这些信息 非常感谢。很

我已经知道的是使用

System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(e, true);
我可以访问其中一些信息(文件的完整路径、行号等)。但这些信息并不是我所需要的全部。例如,我不知道如何从跟踪中提取解决方案名称或命名空间名称。显然,解析文件路径也不是一个选项,因为不同的错误可能有多个文件和文件夹层次结构层,并且一个全局规则并不适用于所有错误

我想知道有没有办法通过编程方式访问这些信息


非常感谢。

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

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

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

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

  • 像“解决方案”和“项目”这样的概念只适用于编译时(甚至特定于VisualStudio——编译器不需要以这种方式对代码进行分区)。它们不会反映在二进制文件或调试符号中,因此对运行时不可用。您可以使用属性和/或生成的代码将它们显式嵌入程序集中,但仍必须处理它们不可用的情况。命名空间虽然在堆栈框架中不立即可用,但可以从nam中确定方法所处类型的e(
    .GetMethod().ReflectedType.Namespace
    )。例如ToString()是您将从中获得的最大信息量。正如@Jeroenmoster所说,解决方案和项目是编译器唯一的东西。甚至是Visual Studio唯一的东西。然而,这也应该是很明显的,因为命名空间/函数名在堆栈跟踪中,您应该知道哪个程序会抛出异常,然后才能删除g it.我经常链接两篇关于异常处理的文章,这两篇文章可能会帮助您了解该怎么做:|您想知道您列出的关于异常最初抛出点的信息,还是关于异常被捕获点的信息?我想从异常发生点获取信息像“解决方案”和“项目”这样的东西都是只在编译时使用的概念(甚至特定于VisualStudio——编译器不需要以这种方式对代码进行分区)。它们不会反映在二进制文件或调试符号中,因此对运行时不可用。您可以使用属性和/或生成的代码将它们显式嵌入程序集中,但仍必须处理它们不可用的情况。命名空间虽然在堆栈框架中不立即可用,但可以从nam中确定方法所处的类型(
    .GetMethod().ReflectedType.Namespace
    )。例如,ToString()是从中获得的最大信息量。正如@JeroenMostert所说,解决方案和项目只是编译器的一部分,甚至是可视化研究