@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 方法支援以下引數

方法引數 描述

例外類型

用於存取引發的例外。這是任何類型的 ExceptionThrowable

終端機

用於存取底層的 JLine 終端機,例如取得其終端機寫入器。

傳回值

@ExceptionResolver 方法支援以下傳回值

傳回值 描述

String

要返回到 shell 的純文字。在這種情況下使用退出代碼 1。

CommandHandlingResult

具有訊息和退出代碼的純 CommandHandlingResult

void

具有 void 返回類型的方法被認為已完全處理例外。通常,您會將 Terminal 定義為方法引數,並使用其中的終端機寫入器寫入回應。由於例外已完全處理,因此在這種情況下使用退出代碼 0。