有没有一种简单的方法来确定从 Exception 对象引发异常的位置

本文关键字:Exception 对象 位置 异常 一种 方法 简单 有没有 | 更新日期: 2023-09-27 18:35:50

所以,如果我没记错的话,我似乎记得在 4.5 中看到一些新的注释添加到 C# 中,这些注释允许您通过记录器或其他东西准确定位异常的位置(类、方法、行)。但在此之前,是否有任何内置方法至少可以识别从实际异常对象引发异常的类和方法,而无需解析堆栈跟踪?我希望能够使用异常对象说,将一条消息输出到日志中,上面写着" Exception was thrown at MyProject.MyClass.MyMethod(int, string). Message: <exception message>

意识到有一些第三方库可以帮助解决这个问题,但如果可能的话,我宁愿让它更简单,同时更多地了解 FCL。目的不是更改异常是什么,而是使它们在未处理的情况下更有用。例如,筛选器会引发并捕获未经处理的异常。筛选器记录异常并重新引发异常。如果创建的日志可以声明"它被扔到这里,请参阅完整堆栈跟踪以获取更多信息",那就太好了。这将使我们更快地查看位置,而不必在堆栈跟踪中游泳,在某些情况下(至少对于我们的一些旧东西)可能会非常误导,导致追逐我们的尾巴只是发现如果我们重新确定从哪里开始,我们会很快发现问题。

有没有一种简单的方法来确定从 Exception 对象引发异常的位置

如果您确实需要从Exception对象中解析出各个帧,请使用System.Diagnostics.StackTrace

using System;
using System.Diagnostics;
public class Program
{
    public static void Main(string[] args)
    {
        try
        {
            Thrower();
        }
        catch (Exception e)
        {
            var trace = new StackTrace(e);
            Console.WriteLine(trace.GetFrame(0).GetMethod());
        }              
    }
    private static string Thrower()
    {
        throw new Exception("Boom");
    }
}

您所指的功能称为呼叫者信息属性,本身与异常没有任何关系。它是一般功能,主要用于吟游诗人。当您使用程序集时,该信息将在编译时插入到程序集中,类似于C++中的__LINE____FILE____FUNCTION__宏。

对于异常的来源,您可以查看 Exception.Source 属性,该属性提供了如下信息:

导致错误的应用程序或对象的名称。

您不需要解析堆栈跟踪,它只是一个包含所有数据的字符串,在某些情况下可能会变得有用。请记住,在特殊情况下exception,您需要尽可能多的信息。