从基类中抛出的异常中获取实际类型

时间:2014-02-26 21:24:41

标签: c# exception inheritance

我在我的应用程序中设置了一系列类,如下所示:

abstract class Foo<TYPE> where TYPE : new()
{
    public void Error() 
    {
        List<TYPE> foo = null;
        foo.Add(new TYPE());
    }
}

class Bar : Foo<int>
{

}

当对Bar.Error()的调用抛出异常时,堆栈跟踪只会将其报告为Foo'1.Error()。我确切地知道为什么它会这样做,但我需要知道它是一个实际抛出错误的Bar对象。如何从被抛出的Exception对象中获取它?

2 个答案:

答案 0 :(得分:2)

你不能,只是从一个你无法控制的例外。异常中没有任何迹象表明在生成异常时有一个方法执行的实例。

我建议使用调试器(以便在抛出异常时可以中断)和/或使用更多诊断日志记录。 (例如,在方法开头记录this的类型。)


原始答案,当方法本身直接抛出异常

(为后人保留这一点 - 对其他人可能有用。)

可以使用Source属性,或者Data属性来记录类型或实例的名称。例如:

abstract class Foo<TYPE>
{
    public void Error() 
    {
        throw new Exception("Whoops") { Data = {{ "Instance", this }} };
    }
}

...然后使用:

catch (Exception e)
{
    var instance = e.Data["instance"];
    // Use the instance
}

然而,这是一个非常奇怪的用法。抛出自己的自定义异常类型可能更合适,显式知道生成它的实例。

答案 1 :(得分:0)

您可以尝试编写具有Type属性的自定义Exception类型,例如

public class CustomException : Exception {
    public Type ExceptionSourceType{get;set;}
}


abstract class Foo<TYPE>
{
    public void Error() 
    {
        var exception = new CustomException ("Whoops");
        exception.ExceptionSourceType = this.GetType();
        throw exception;
    }
}

然后,如果您专门捕获这些类型的错误,您可以轻松访问该属性

catch(CustomException ex){
    var sourceType = ex.ExceptionSourceType;
}