@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 方法支持以下返回值

返回值 描述

字符串

返回给 Shell 的纯文本。在这种情况下,使用退出码 1。

CommandHandlingResult

包含消息和退出码的纯 CommandHandlingResult

void

返回类型为 void 的方法被认为已完全处理了异常。通常,您会将 Terminal 定义为方法参数,并使用其终端写入器写入响应。由于异常已完全处理,在这种情况下,使用退出码 0。

© . This site is unofficial and not affiliated with VMware.