@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";
}
戻り値の型が void
の @ExceptionResolver
は、処理済み例外として自動的に処理されます。コンソールに何かを書き込む必要がある場合は、@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();
}