@ExceptionResolver

@ShellComponent 类可以使用 @ExceptionResolver 方法来处理组件方法的异常。这些方法适用于带注解的方法。 该异常可能与传播的顶级异常相匹配(例如,直接抛出的 IOException),或与包装器异常中的嵌套原因相匹配(例如,包装在 IllegalStateException 中的 IOException)。它可以在任意原因级别匹配。 对于匹配的异常类型,最好将目标异常声明为方法参数,如前面的示例所示。如果匹配多个异常方法,通常优先匹配根异常而不是原因异常。更具体地说,ExceptionDepthComparator 会根据异常深度对异常进行排序,从而从抛出异常的类型开始排序。 或者,注释声明可以缩小要匹配的异常类型,如下例所示:

link:../../test/java/org/springframework/shell/docs/ErrorHandlingSnippets.java[role=include]
link:../../test/java/org/springframework/shell/docs/ErrorHandlingSnippets.java[role=include]

@ExceptionResolver 还可以返回 String,后者可用作控制台输出。您可以使用 @ExitCode 注释来定义返回代码。

link:../../test/java/org/springframework/shell/docs/ErrorHandlingSnippets.java[role=include]

@ExceptionResolvervoid 返回类型一起自动被处理为已处理的异常。然后,您还可以定义 @ExitCode,并在需要向控制台写入内容时使用 Terminal

link:../../test/java/org/springframework/shell/docs/ErrorHandlingSnippets.java[role=include]

Method Arguments

@ExceptionResolver 方法支持以下参数:

Method argument Description

Exception type

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

Terminal

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

Return Values

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

Return value Description

String

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

CommandHandlingResult

具有消息和退出代码的纯 CommandHandlingResult

void

具有 void 返回类型的函数被认为完全处理了异常。通常,你可以将 Terminal 定义为一个函数参数,并使用 terminal writer 从中写入响应。由于异常已被完全处理,所以在此情况下使用退出代码 0。