异常解析

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