我正在尝试在 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)
通常,当基类已经显着设置了对象时,我们可以调用类似的构造函数将实例化的责任传递给基类。
我通过使用不是主构造函数的主构造函数解决了这个问题。 主构造函数要求每个辅助构造函数都使用 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)
{
}
}
这样,我可以创建一个支持内部异常参数的自定义异常,而不会出现编译器错误。我希望这对遇到类似问题的人有所帮助。