6

假设我有以下代码

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

class Derived : Base
{

}

并假设我实例化 Derived 类。

Derived d = new Derived();

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

4

2 回答 2

12

的构造函数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();
于 2013-09-13T22:02:22.873 回答
1

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

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
    }
}
于 2017-10-19T18:45:40.357 回答