@ShellComponent类可以具有处理组件异常的方法 方法。这些是针对带注释的方法的。@ExceptionResolver

异常可能与正在传播的顶级异常(例如直接 IOException)匹配 被抛出)或针对包装器异常中的嵌套原因(例如,包装的 IOException 在 IllegalStateException 中)。这可以在任意原因级别匹配。

对于匹配异常类型,最好将目标异常声明为方法参数,如 前面的示例显示。当多个异常方法匹配时,根异常匹配为 通常首选原因异常匹配。更具体地说,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";
}

@ExceptionResolver返回类型自动处理为处理异常。 然后,如果需要编写内容,还可以定义和使用 进入控制台。void@ExitCodeTerminal

@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

方法参数 描述

异常类型

用于访问引发的异常。这是任何类型的 或 .ExceptionThrowable

终端

为了访问底层终端,即获取其终端编写器。JLine

返回值

@ExceptionResolver方法支持以下返回值:

返回值 描述

字符串

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

命令HandlingResult

普通有消息和退出代码。CommandHandlingResult

无效

具有 void 返回类型的方法被视为已完全处理异常。通常 您可以定义为方法参数,并使用终端编写器从中编写响应。由于异常已完全处理,因此在这种情况下使用退出代码 0。Terminal

返回值 描述

字符串

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

命令HandlingResult

普通有消息和退出代码。CommandHandlingResult

无效

具有 void 返回类型的方法被视为已完全处理异常。通常 您可以定义为方法参数,并使用终端编写器从中编写响应。由于异常已完全处理,因此在这种情况下使用退出代码 0。Terminal