繁体   English   中英

有没有一种简单的方法可以识别从Exception对象引发异常的位置?

[英]Is there an easy way to identify where an exception was thrown from the Exception object?

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

我意识到有一些第三方库可以帮助解决此问题,但是我希望在学习更多有关FCL的同时尽可能简化它。 目的不是更改异常是什么,而是使它们在未处理的情况下更有用。 例如,未处理的异常被过滤器抛出并捕获。 筛选器记录异常并重新抛出它。 如果创建的日志可以声明“它被扔在这里,请参阅完整的堆栈跟踪以获取更多信息”,那将是很好的。 这样一来,我们无需查看堆栈跟踪就可以更快地查看位置 ,这在某些情况下(至少对于某些较早的版本而言)可能会产生极大的误导性,从而导致追尾而仅发现我们会如果我们确切地从哪里开始,很快就会发现问题。

如果您确实需要从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");
    }
}

您所指的功能称为“ 呼叫者信息属性” ,本质上与异常没有任何关系。 它是一般用于故障排除的常规功能。 这些信息是在编译时间,当你使用它,类似于插入组件__LINE____FILE____FUNCTION__宏在C ++中。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM