@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();
}

メソッド引数

@ExceptionResolver メソッドは、次の引数をサポートしています。

メソッド引数 説明

例外型

発生した例外へのアクセス用。これは、任意の型の Exception または Throwable です。

ターミナル

基盤となる JLine ターミナルにアクセスして、ターミナルライターを取得します。

戻り値

@ExceptionResolver メソッドは、次の戻り値をサポートしています。

戻り値 説明

String

シェルに戻すプレーンテキスト。この場合、終了コード 1 が使用されます。

CommandHandlingResult

メッセージと終了コードを持つ単純な CommandHandlingResult

void

戻り値の型が void のメソッドは、例外を完全に処理したと見なされます。通常、メソッドの引数として Terminal を定義し、そこからターミナルライターを使用してレスポンスを書き込みます。例外は完全に処理されるため、この場合は終了コード 0 が使用されます。