泛型不直接处理异常,而是通过泛型集合统一收纳子类异常、虚方法实现多态分发、泛型字典建立类型路由,提升异常处理的结构清晰度、类型安全性和可扩展性。

泛型本身不直接“处理”异常,但它能显著提升异常处理的结构清晰度、类型安全性和可扩展性。关键不是用泛型去捕获异常,而是用泛型来组织、传递、分发和统一调度异常对象——让异常真正成为“带身份的活对象”,而不是一堆需要 if-else 拆解的字符串或类型判断。
用泛型集合统一收纳不同异常
把各种具体异常(如 FileOpenException、NetworkTimeoutException)都存进一个泛型集合,比如 List<BaseException>:
- 添加时不需判断类型:
exceptions.add(new FileOpenException("xxx"))、exceptions.add(new NetworkTimeoutException()) - 它们在集合中仍保持各自子类身份,只是通过基类引用暂存
- 后续遍历时调用
e.Handle(),自动触发对应子类重写的逻辑,无需 instanceof 或 switch
靠泛型+虚方法实现“一次分发,多态执行”
定义一个抽象基类或接口(如 BaseException),声明虚方法:
public virtual void Handle() { /* 空实现或默认行为 */ }- 每个子类重写它:
FileOpenException.Handle()弹窗选路径,DivideByZeroException.Handle()记日志并提示输入校验 - catch 块里只写一句:
catch (BaseException e) { e.Handle(); },就覆盖全部子类处理逻辑
用泛型字典做精细类型路由(适合复杂场景)
当不同异常的处理逻辑差异太大,不适合全塞进 Handle() 时,可用泛型字典建立类型到行为的映射:
Dictionary<Type, Action<BaseException>> handlers = new();- 注册:
handlers[typeof(FileOpenException)] = e => ShowFileDialog(e.Message); - 执行:
if (handlers.TryGetValue(e.GetType(), out var action)) action(e); - 新增异常类型?只需加子类 + 注册新 handler,原调度代码完全不动
Java 中的适配要点
Java 没有 C# 那样的 virtual/override 语法糖,但可通过抽象类 + 抽象方法模拟:
- 定义
abstract class BaseException extends Exception,含public abstract void handle(); - 各子类必须实现
handle(),保证多态调用不落空 - 泛型集合用
List<BaseException>,遍历时e.handle()自动分发 - 注意:Java 泛型在运行时被擦除,所以不能用
Class<T>直接做类型匹配;若需反射识别,得显式传入getClass()或Class<?>


















