@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 型別。

Terminal

用於訪問底層的 JLine 終端,例如獲取其終端寫入器。

返回值

@ExceptionResolver 方法支援以下返回值

返回值 描述

String

返回給 shell 的純文字。在此情況下,使用退出碼 1。

CommandHandlingResult

包含訊息和退出碼的普通 CommandHandlingResult

void

返回型別為 void 的方法被認為已完全處理了異常。通常,您可以將 Terminal 定義為方法引數,並使用其提供的終端寫入器寫入響應。由於異常已完全處理,在此情況下使用退出碼 0。