異常解析

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