最新の安定バージョンについては、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 の前後に使用するように制御する必要がある場合に特に便利です。