责任链末端未处理请求时应抛出unhandledrequestexception异常。需定义继承runtimeexception的自定义异常类,链尾处理器在next==null且无法处理时显式throw,构建链时确保终点明确,调用方需try-catch捕获并兜底处理。

当责任链模式的末端节点未处理请求时,可主动抛出 UnhandledRequestException,用 throw 关键字触发异常,让调用方感知“无处理器匹配”。关键在于:链的末尾显式判断并抛出,而非静默忽略。
定义自定义异常 UnhandledRequestException
先创建一个运行时异常类,便于在链路末端快速抛出:
- 继承
RuntimeException,避免强制 try-catch - 提供含消息和可选 cause 的构造方法
public UnhandledRequestException(String message) {
super(message);
}
public UnhandledRequestException(String message, Throwable cause) {
super(message, cause);
}
}
在 Chain 的末端处理器中 throw 异常
责任链通常以 Handler.handle(Request req) 方法串联。若当前处理器不处理,且 next == null(即已是链尾),就应抛出异常:
@Override
public void handle(Request request) {
if (canHandle(request)) {
// 执行处理逻辑
} else if (next == null) {
throw new UnhandledRequestException(
"No handler in chain can process request: " + request);
} else {
next.handle(request);
}
}
}
确保链构建时明确终点
避免因链配置错误导致空指针或静默失败:
- 构建链时,最后一个处理器的
next必须为null - 可在抽象基类中统一检查:
if (next == null && !canHandle(req)) throw new ... - 测试时覆盖“所有处理器都返回 false”的场景,验证异常是否如期抛出
调用方捕获并响应异常
外部代码应预期该异常,并做合理兜底:
try {chain.handle(new Request("DELETE_USER"));
log.warn("Request unhandled", e);
response.setStatus(400);
response.write("Unsupported operation");
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











