最新の安定バージョンについては、Spring Shell 4.0.0 を使用してください!

例外解決

処理されない例外はシェルの 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 がいくつか登録されています。これらは、CommandExceptionResolver.DEFAULT_PRECEDENCE で定義された順序で登録されています。これらの Bean は指定された順序で使用されるため、他の Spring アプリと同様に、@Order アノテーションまたは Ordered インターフェースを使用できます。これは、独自の Bean をデフォルトの Bean の前後に使用するように制御する必要がある場合に特に便利です。