是否有可能捕获派生类构造函数中从基类构造函数抛出的异常

时间:2013-09-13 21:57:48

标签: c# inheritance

假设我有以下代码

class Base
{
    public Base()
    {
        throw new SomeKindOfException();
    }  
}

class Derived : Base
{

}

并假设我实例化了Derived类。

Derived d = new Derived();

为了实例化Derived类,应该首先实例化Base类吗?所以有任何理论或实际方法来捕获派生类构造函数中从基类构造函数抛出的异常。我想没有,但我只是好奇。

2 个答案:

答案 0 :(得分:9)

Base的构造函数总是在Derived的构造函数中的任何代码之前执行,所以没有。 (如果没有在Derived中明确定义构造函数,C#编译器会为您创建一个构造函数public Derived() : base() { }。这是为了防止您不小心使用未完全的对象实例化了。

您可以做的是使用单独的方法初始化对象的一部分:

class Base
{
    public virtual void Initialize()
    {
        throw new SomeKindOfException();
    }  
}

class Derived : Base
{
    public override void Initialize()
    {
        try
        {
            base.Initialize();
        }
        catch (SomeKindOfException)
        {
            ...
        }
    }
}
var obj = new Derived();
obj.Initialize();

答案 1 :(得分:0)

我有类似的需求,但我的基础构造函数基于从派生类传入的参数初始化一些只读属性,因此上述解决方案对我不起作用。我所做的是向构造函数中的catch子句中设置的基类添加一个只读的Exception属性,然后派生类可以在它自己的构造函数中检查并正确处理。

class Base
{
    public Base(string parameter)
    {
        try
        {
            // do something with parameter
        }
        catch (Exception exception)
        {
            ExceptionProperty = exception;
        }
    }

    public Exception ExceptionProperty  { get; }
}

class Derived : Base("parameter")
{
    if (ExceptionProperty != null)
    {
        // handle the exception
    }
}