例外解決

未処理の例外は、シェルの 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 を制御する必要がある場合に役立ちます。