異常解析
未處理的異常將向上冒泡到 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 之前或之後使用,這通常非常有用。