从基类中引发的异常中获取实际类型



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

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对象中得出它?

你不能

,只是来自你无法控制的异常。异常中没有指示生成异常时哪个实例碰巧执行了方法。

我建议使用调试器(以便在引发异常时可以中断)和/或使用更多的诊断日志记录。(例如,在方法开始时记录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
}

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

您可以尝试编写具有 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;
}

最新更新