@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";
}
@ExceptionResolver
返回类型为 void
时会被自动处理为已处理的异常。然后你也可以定义 @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 。 |
Terminal | 用于访问底层的 JLine 终端,例如获取其终端写入器。 |
返回值
@ExceptionResolver
方法支持以下返回值:
返回值 | 描述 |
---|---|
String | 要返回给 shell 的纯文本。在这种情况下,使用退出代码 1。 |
CommandHandlingResult | 具有消息和退出代码的纯 CommandHandlingResult 。 |
void | 具有 void 返回类型的的方法被视为已完全处理异常。通常你会将 Terminal 定义为方法参数,并使用其中的 终端写入器 编写响应。由于异常已被完全处理,在这种情况下使用退出代码 0。 |