跳到主要内容

异常解析

QWen Max 中英对照 Exception Resolving

未处理的异常将冒泡到 shell 的 ResultHandlerService,然后最终由某个 ResultHandler 实例处理。可以使用 ExceptionResolver 实现链来解析异常,并为您提供灵活性,以返回消息并将其与退出代码一起写入控制台,这些消息和退出代码被封装在 CommandHandlingResult 中。CommandHandlingResult 可能包含 消息 和/或 退出代码

static class CustomExceptionResolver implements CommandExceptionResolver {

@Override
public CommandHandlingResult resolve(Exception e) {
if (e instanceof CustomException) {
return CommandHandlingResult.of("Hi, handled exception\n", 42);
}
return null;
}
}
java

CommandExceptionResolver 实现可以作为 bean 全局定义。

@Bean
CustomExceptionResolver customExceptionResolver() {
return new CustomExceptionResolver();
}
java

或在适用于特定命令本身时,为每个 CommandRegistration 定义。

CommandRegistration.builder()
.withErrorHandling()
.resolver(new CustomExceptionResolver())
.and()
.build();
java
备注

通过命令定义的解析器会在全局解析器之前处理。

使用你自己的异常类型,如果希望在其中定义退出代码,它也可以是 boot 的 ExitCodeGenerator 的实例。

static class CustomException extends RuntimeException implements ExitCodeGenerator {

@Override
public int getExitCode() {
return 0;
}
}
java

一些内置的 CommandExceptionResolver bean 被注册来处理从命令解析中抛出的常见异常。这些 bean 的优先级顺序由 CommandExceptionResolver.DEFAULT_PRECEDENCE 定义。由于这些 bean 是按照特定顺序使用的,可以像在其他任何 Spring 应用程序中一样使用 @Order 注解或 Ordered 接口。如果你需要控制自己的 bean 在默认 bean 之前或之后使用,这通常会很有用。