有没有一种简单的方法来识别从Exception对象抛出异常的位置?

时间:2014-12-31 18:17:37

标签: c# exception logging

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

之类的日志

我意识到有一些第三方库可以帮助解决这个问题,但是如果可能的话,我会更加简单地了解FCL。目的不是改变异常是什么,而是在未处理的情况下使它们更有用。例如,抛出一个未处理的异常并被过滤器捕获。过滤器记录异常并重新生成它。如果创建的日志可以声明“它被扔到这里,请查看完整的堆栈跟踪以获取更多信息”,这将是很好的。这样我们就可以更快地查看 where 而无需游过堆栈跟踪,在某些情况下(至少对于我们的一些旧版本的东西)可能会产生误导,导致追逐我们如果我们确切地知道从哪里开始,我们就会发现我们很快就会发现问题。

2 个答案:

答案 0 :(得分:2)

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

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");
    }
}

您所指的功能称为Caller Info Attributes,并且本身并不与例外有任何关系。它是一般性功能,主要用于故障排除。在您使用它时,信息将在编译时插入到程序集中,类似于C ++中的__LINE____FILE____FUNCTION__宏。

答案 1 :(得分:1)

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

  

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

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