异常解析
未处理的异常将冒泡到 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;
}
}
CommandExceptionResolver
实现可以作为 bean 全局定义。
@Bean
CustomExceptionResolver customExceptionResolver() {
return new CustomExceptionResolver();
}
或在适用于特定命令本身时,为每个 CommandRegistration
定义。
CommandRegistration.builder()
.withErrorHandling()
.resolver(new CustomExceptionResolver())
.and()
.build();
备注
通过命令定义的解析器会在全局解析器之前处理。
使用你自己的异常类型,如果希望在其中定义退出代码,它也可以是 boot 的 ExitCodeGenerator
的实例。
static class CustomException extends RuntimeException implements ExitCodeGenerator {
@Override
public int getExitCode() {
return 0;
}
}
一些内置的 CommandExceptionResolver
bean 被注册来处理从命令解析中抛出的常见异常。这些 bean 的优先级顺序由 CommandExceptionResolver.DEFAULT_PRECEDENCE
定义。由于这些 bean 是按照特定顺序使用的,可以像在其他任何 Spring 应用程序中一样使用 @Order
注解或 Ordered
接口。如果你需要控制自己的 bean 在默认 bean 之前或之后使用,这通常会很有用。