非泛型场景下实例化Exception类型的实现问题求助
解决方法分析与修复代码
首先,你的代码里有个关键疏漏:ErrorCode的构造函数没有给ExceptionT属性赋值,这会导致调用ThrowException时ExceptionT为null,直接引发空引用异常。这是第一个要修复的点。
其次,关于Activator.CreateInstance返回object类型的问题,我们可以通过提前验证类型合法性,再进行安全强制转换来解决。以下是完整的修复方案:
修复后的ErrorCode类
public class ErrorCode { public int HttpStatus { get; private set; } public string JsonErrorCode { get; private set; } public Type ExceptionT { get; private set; } public ErrorCode(string pJsonErrorCode, int pHttpStatus, Type pExceptionType) { // 验证传入的异常类型有效性 if (pExceptionType == null) throw new ArgumentNullException(nameof(pExceptionType)); if (!typeof(Exception).IsAssignableFrom(pExceptionType)) throw new ArgumentException($"类型 {pExceptionType.Name} 必须继承自 System.Exception", nameof(pExceptionType)); if (pExceptionType.GetConstructor(new[] { typeof(string) }) == null) throw new ArgumentException($"类型 {pExceptionType.Name} 没有接受单个string参数的构造函数", nameof(pExceptionType)); // 补全属性赋值 this.HttpStatus = pHttpStatus; this.JsonErrorCode = pJsonErrorCode; this.ExceptionT = pExceptionType; } public void ThrowException(string pMsg) { // 安全强转为Exception,因为构造阶段已经验证过类型 var exception = (Exception)Activator.CreateInstance(ExceptionT, pMsg); throw exception; } }
为什么这样修复?
- 构造函数验证:提前检查传入的
Type是否符合要求(是Exception子类、有指定构造函数),把错误提前暴露在初始化阶段,而不是在抛出异常时才发现问题,便于调试和维护。 - 安全强转:因为已经在构造阶段确认了类型合法性,所以
(Exception)强制转换是安全的,不会出现类型转换异常。 - 补全属性赋值:解决了原代码中
ExceptionT未初始化的核心问题。
字典使用保持不变
你的字典添加逻辑不需要修改,只要确保对应的异常类型满足构造函数的验证要求(继承Exception、有string参数构造函数)即可:
Protocol.ErrorCodes.Add(ErrorCodeType.ElementClickIntercepted, new ErrorCode("element click intercepted", 400, typeof(ElementClickInterceptedException)));
如果部分异常类型没有string参数的构造函数,你可以根据实际情况调整验证逻辑,或者使用Activator.CreateInstance的其他重载(比如无参构造),但统一使用带消息的构造函数会让错误信息更清晰,更利于问题排查。
内容的提问来源于stack exchange,提问作者Andrew Mills
相关产品推荐
相关产品推荐

