让我们考虑一下,我们在代码中抛出了一个异常。现在在捕获正文中,我想访问六条信息:
- 解决方案名称
- 项目名称
- 命名空间名称
- 文件名
- 方法名称
- 行号
我已经知道的是,使用
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(e, true);
我可以访问其中一些信息(文件的完整路径,行号等(。但这些信息仍然不是我所需要的全部。例如,我不知道如何从跟踪中提取解决方案名称或命名空间名称。显然,解析文件的路径也不是一种选择,因为不同的错误可能具有多个文件和文件夹层次结构层,并且一个全局规则不适用于所有错误。
我想知道有没有办法以编程方式访问这些信息?
非常感谢。
你很可能不会得到完全适合你要求的东西,但我会分享一些你可能不知道或考虑过的工具和想法:
- 有一些属性(
CallerFilePathAttribute
、CallerLineNumberAttribute
和CallerMemberNameAttribute
,当添加到可选方法参数时,将导致编译器根据正在编译的代码的上下文自动插入默认值。可以使用如下所示的属性创建帮助程序方法来捕获所需的信息。 - 有像Fody这样的工具,称为"IL Weavers",它可以在主编译过程之后运行并以特定方式更改编译的代码。例如,可以编写代码来对一种方法进行简单调用,但是在编译时,Weaver 可以更改代码以创建一堆上下文信息并将其传递给日志记录方法。
- 如果代码组织良好,通常可以确保命名空间、类和方法(它们都作为堆栈跟踪的一部分捕获(是足够的信息,可以猜测解决方案、项目和文件名。
- 捕获异常时,通常希望记录发生的情况并以特定方式处理异常,或者只是将异常包装在另一个异常中,其中包含更多上下文信息。如果选择后者,则命名空间、类和方法名称将包含在引发的异常的堆栈跟踪中。因此,当它进一步记录在堆栈上时,您将可以访问该数据。