C#自定义异常必须继承System.Exception或其子类,否则编译报错CS0155;需实现4个构造函数以支持序列化,推荐加ErrorCode等属性但须正确处理序列化,并遵循命名、注释和轻量原则。 在C#中创建自定义异常,其核心要求是必须继承System.Exception或其任意子类。违反此规

在C#中创建自定义异常,其核心要求是必须继承System.Exception或其任意子类。违反此规则将导致编译错误CS0155: Cannot throw an object that does not inherit from 'System.Exception'。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
这源于C#公共语言运行时的底层设计。CLR规定所有可抛出的异常对象类型必须是System.Exception的派生类。
Exception是CLR唯一认可的异常根类型。ApplicationException类。ArgumentException或InvalidOperationException。为确保异常在跨进程通信或日志捕获时不丢失信息,实现序列化支持至关重要。一个健壮的自定义异常通常需要以下四个构造函数:
(string message)的构造函数。(string message, Exception innerException)的构造函数(用于构建异常链)。(SerializationInfo info, StreamingContext context)构造函数(用于序列化兼容)。标准示例代码如下:
public class InvalidOrderStateException : Exception
{
public InvalidOrderStateException() { }
public InvalidOrderStateException(string message) : base(message) { }
public InvalidOrderStateException(string message, Exception innerException)
: base(message, innerException) { }
protected InvalidOrderStateException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
}
为异常添加如ErrorCode等额外属性能丰富错误信息,但需注意以下要点:
info读取值。Exception.Data字典属性,它无需修改类结构且自动参与序列化。以下为安全添加ErrorCode属性的示例:
public class PaymentFailedException : Exception
{
public int ErrorCode { get; }
public PaymentFailedException(int errorCode, string message)
: base(message)
{
ErrorCode = errorCode;
}
protected PaymentFailedException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
ErrorCode = info.GetInt32(nameof(ErrorCode));
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue(nameof(ErrorCode), ErrorCode);
base.GetObjectData(info, context);
}
}
为提升代码可维护性和团队协作效率,建议注意以下工程细节:
[Serializable]特性以确保自定义序列化逻辑生效(在.NET Framework中为必需,.NET Core/.NET 5+中建议添加)。理解异常的本质是关键:异常标志着正常程序流程的中断,其核心职责是清晰传达错误内容、位置及原因,而非执行修复或重试逻辑。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述