是否可以捕获派生类构造函数中的基类构造函数引发的异常

本文关键字:构造函数 基类 异常 派生 是否 | 更新日期: 2023-09-27 18:31:11

>假设我有以下代码

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

并假设我实例化派生类。

Derived d = new Derived();

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

是否可以捕获派生类构造函数中的基类构造函数引发的异常

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();

我有类似的需求,但我的基本构造函数根据从派生类传入的参数初始化一些只读属性,因此上述解决方案对我不起作用。我所做的是将一个只读的 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
    }
}