@ExceptionResolver
@ShellComponent クラスには、コンポーネントメソッドからの例外を処理するための @ExceptionResolver メソッドを含めることができます。これらは、アノテーション付きメソッド用です。
例外は、伝播されるトップレベルの例外(例: 直接スローされる IOException)またはラッパー例外内のネストされた原因(例: IllegalStateException 内にラップされた IOException)に一致する可能性があります。これは任意の原因レベルで一致できます。
例外の型を一致させるには、前述の例のように、対象例外をメソッド引数として宣言するのが望ましいです。複数の例外メソッドが一致する場合、通常は原因例外の一致よりもルート例外の一致が優先されます。具体的には、ExceptionDepthComparator は、スローされた例外の型からの深さに基づいて例外をソートするために使用されます。
または、次の例に示すように、アノテーション宣言により、一致するように例外型を絞り込むことができます。
@ExceptionResolver({ RuntimeException.class })
CommandHandlingResult errorHandler(Exception e) {
// Exception would be type of RuntimeException,
// optionally do something with it
return CommandHandlingResult.of("Hi, handled exception\n", 42);
}@ExceptionResolver
CommandHandlingResult errorHandler(RuntimeException e) {
return CommandHandlingResult.of("Hi, handled custom exception\n", 42);
}@ExceptionResolver は、コンソールへの出力として使用される String を返すこともできます。@ExitCode アノテーションを使用して戻りコードを定義できます。
@ExceptionResolver
@ExitCode(code = 5)
String errorHandler(Exception e) {
return "Hi, handled exception";
}@ExceptionResolver と void の戻り値は、自動的に例外として処理されます。コンソールに何かを書き込む必要がある場合は、@ExitCode を定義して Terminal を使用することもできます。
@ExceptionResolver
@ExitCode(code = 5)
void errorHandler(Exception e, Terminal terminal) {
PrintWriter writer = terminal.writer();
String msg = "Hi, handled exception " + e.toString();
writer.println(msg);
writer.flush();
}