You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# 12类中实现带内部异常参数的构造函数

解决C# 12主构造函数类中实现带内部异常的构造函数问题

错误原因

当类使用C# 12主构造函数(类名后直接带参数列表的语法)时,所有显式声明的自定义构造函数必须通过this(...)调用本类的构造函数(主构造函数或其他自定义构造函数),不能直接使用base(...)调用基类构造函数,这就是编译错误CS8862的触发原因。

两种正确实现方式

方式1:保留主构造函数,扩展参数覆盖场景

调整主构造函数,添加可选的innerException参数,让所有构造函数通过this(...)链到主构造函数,同时由主构造函数负责调用基类的对应构造函数:

public class TokenAcquisitionException(string message, Exception? innerException = null) 
    : Exception(message, innerException)
{
    private const string FailedToGetToken = "Failed to get token";

    // 无参构造函数:调用主构造函数,传入默认错误消息
    public TokenAcquisitionException() : this(FailedToGetToken)
    {
    }

    // 仅带消息的构造函数:调用主构造函数,innerException传null
    public TokenAcquisitionException(string message) : this(message, null)
    {
    }
}

这种写法既保留了主构造函数的简洁性,又能正确传递内部异常到基类,符合异常类的规范实现。

方式2:放弃主构造函数,使用传统构造函数写法

如果不需要主构造函数的语法糖,可以回到传统的构造函数声明方式,自由调用基类的对应构造函数:

public class TokenAcquisitionException : Exception
{
    private const string FailedToGetToken = "Failed to get token";

    public TokenAcquisitionException() : base(FailedToGetToken)
    {
    }

    public TokenAcquisitionException(string message) : base(message)
    {
    }

    public TokenAcquisitionException(string message, Exception innerException) : base(message, innerException)
    {
    }
}

这种写法没有主构造函数的限制,完全遵循传统异常类的实现模式,适合习惯旧语法的开发者。

为什么之前的修改无效

你之前将base改为this(message)的写法,虽然解决了编译错误,但主构造函数只调用了Exception(message),没有把innerException传递给基类,导致最终异常对象的InnerException属性无法被正确设置,不符合需求。

内容的提问来源于stack exchange,提问作者Mavaddat Javid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:21:34