如何编写带有内部异常参数的 C# 构造函数

问题描述 投票:0回答:1

我正在尝试在 C# 12.0(.NET 8.0,SDK 版本:8.0.100-rc.2.23502.2)中创建一个自定义异常类,该类支持带有内部 exception 参数的构造函数。这是我最初尝试的代码:

public class TokenAcquisitionException(string message) : Exception(message)
{
    private const string FailedToGetToken = "Failed to get token";
    public TokenAcquisitionException() : this(FailedToGetToken)
    {        
    }

    public TokenAcquisitionException(string message, Exception innerException) : base(message, innerException)
    {
        /* What do I put here? */
    }
}

但是,当我尝试编译此代码时,出现以下错误:

Error CS8862 A constructor declared in a type with parameter list must have 'this' constructor initializer.

我发现了一个 GitHub 问题 讨论了类似的错误,但是 它与 C# 9 及更高版本中的记录相关,而不是类。问题 建议记录中的每个构造函数都具有主构造函数 必须使用

this
调用主构造函数,否则 编译器不知道如何处理主构造函数 参数。

我尝试了各种方法来解决这个问题,包括创建一个 自定义异常,例如

TokenAcquisitionException
和 在构造函数中使用
this
而不是
base

public class TokenAcquisitionException(string message) : Exception(message)
{
    private const string FailedToGetToken = "Failed to get token";
    public TokenAcquisitionException() : this(FailedToGetToken)
    {
    }

    public TokenAcquisitionException(string message, Exception innerException) : this(message)
    {
        /* What do I put here? */
    }
}

但是,这些方法都不起作用。

有谁知道如何正确实现带有内部的构造函数 C# 类中的异常参数?任何帮助都会很大 赞赏。

我期望可以使用相同的构造函数签名调用基类构造函数:

base(message, innerException)

通常,当基类已经显着设置了对象时,我们可以调用类似的构造函数将实例化的责任传递给基类。

oop constructor .net-8.0 c#-12.0
1个回答
0
投票

我通过使用不是主构造函数的主构造函数解决了这个问题。 主构造函数要求每个辅助构造函数都使用 this 来调用它,这不是我想要的。相反,我使用了从基类构造函数继承的主构造函数,然后我可以创建也使用不同参数调用基类构造函数的辅助构造函数。这是我使用的代码:

/// <summary>
/// Exception to indicate failed token acquisition.
/// </summary>
/// <seealso cref="System.Exception" />
public class TokenAcquisitionException : Exception
{
    public TokenAcquisitionException() : base($"{BaseMessage}.")
    {

    }

    public TokenAcquisitionException(string specificMessage) : base($"{BaseMessage}: {specificMessage}")
    {
    }

    public TokenAcquisitionException(string specificMessage, Exception innerException) : base($"{BaseMessage}: {specificMessage}", innerException)
    {
    }
}

这样,我可以创建一个支持内部异常参数的自定义异常,而不会出现编译器错误。我希望这对遇到类似问题的人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.