异常解析
未处理的异常将向上冒泡到 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;
}
}
Spring Shell 注册了一些内置的 CommandExceptionResolver Bean 来处理命令解析抛出的常见异常。这些 Bean 按照 CommandExceptionResolver.DEFAULT_PRECEDENCE 中定义的顺序优先级注册。由于这些 Bean 按照给定顺序使用,因此可以使用 @Order 注解或 Ordered 接口,就像在任何其他 Spring 应用中一样。如果您需要控制自己的 Bean 在默认 Bean 之前或之后使用,这通常非常有用。