异常解析

未处理的异常会冒泡到 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();
使用命令定义的解析器在全局解析器之前处理。

您可以使用自己的异常类型,如果需要在此处定义退出代码,它们也可以是 Spring Boot 的 ExitCodeGenerator 实例

static class CustomException extends RuntimeException implements ExitCodeGenerator {

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

一些内置的 CommandExceptionResolver Bean 被注册以处理从命令解析中抛出的常见异常。这些 Bean 以 CommandExceptionResolver.DEFAULT_PRECEDENCE 中定义的“顺序”优先级注册。由于这些 Bean 按给定顺序使用,因此 @Order 注解或 Ordered 接口可以像在任何其他 Spring 应用程序中一样使用。如果您需要控制自己的 Bean 在默认 Bean 之前或之后使用,这通常很有用。

© . This site is unofficial and not affiliated with VMware.