未经处理的异常将冒泡到 shell 中,然后最终 由 的某个实例处理。实施链 可用于解决异常,并让您灵活地返回消息进行写入 与包装在 中的退出代码一起进入控制台。 可能包含消息和/或退出代码ResultHandlerServiceResultHandlerExceptionResolverCommandHandlingResultCommandHandlingResult

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();
}

或定义 per 如果它仅适用于特定命令本身。CommandRegistration

CommandRegistration.builder()
	.withErrorHandling()
		.resolver(new CustomExceptionResolver())
		.and()
	.build();
使用命令定义的解析器在全局解析器之前处理。
使用命令定义的解析器在全局解析器之前处理。

使用您自己的异常类型,也可以是 boot 的实例 if 您希望在那里定义退出代码。ExitCodeGenerator

static class CustomException extends RuntimeException implements ExitCodeGenerator {

	@Override
	public int getExitCode() {
		return 0;
	}
}

一些内置 bean 被注册为处理常见的 命令解析引发的异常。这些都使用 中定义的顺序优先级进行注册。 由于这些 bean 是按给定顺序使用的,因此可以像在任何其他 Spring 应用程序中使用一样使用注释或接口。这 如果您需要控制自己的 Bean 才能使用,则通常很有用 在默认值之前或之后。CommandExceptionResolverCommandExceptionResolver.DEFAULT_PRECEDENCE@OrderOrdered