例外解析

未處理的例外將會冒泡到 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 beans 已註冊以處理從命令解析擲回的常見例外。這些以 CommandExceptionResolver.DEFAULT_PRECEDENCE 中定義的順序優先順序註冊。由於這些 beans 以給定的順序使用,因此可以像在任何其他 Spring 應用程式中一樣使用 @Order 註解或 Ordered 介面。如果您需要控制自己的 beans 以在預設值之前或之後使用,這通常很有用。