MethodHandles.CatchException(MethodHandle, Class, MethodHandle) 方法

定义

通过在异常处理程序中运行它,使方法句柄适应目标方法句柄。

[Android.Runtime.Register("catchException", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/Class;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public static Java.Lang.Invoke.MethodHandle? CatchException (Java.Lang.Invoke.MethodHandle? target, Java.Lang.Class? exType, Java.Lang.Invoke.MethodHandle? handler);
[<Android.Runtime.Register("catchException", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/Class;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
static member CatchException : Java.Lang.Invoke.MethodHandle * Java.Lang.Class * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle

参数

target
MethodHandle

要调用的方法句柄

exType
Class

处理程序将捕获的异常类型

handler
MethodHandle

引发匹配异常时要调用的方法句柄

返回

合并指定 try/catch 逻辑的方法句柄

属性

注解

通过在异常处理程序中运行它,使方法句柄适应目标方法句柄。 如果目标正常返回,适配器将返回该值。 如果引发与指定类型匹配的异常,则会改为对异常调用回退句柄,以及原始参数。

目标和处理程序必须具有相同的相应参数和返回类型,但该处理程序可能省略尾随参数(类似于谓词中的 #guardWithTest guardWithTest谓词)。 此外,处理程序必须具有额外的前导参数 exType 或超类型。

下面是生成的适配器的伪代码。 在代码中,T表示生成的适配器的targethandler返回类型,以及结果适配器的返回类型;Aa/以及由生成的句柄使用的自变量的类型和值;以及B/b由此丢弃handler的句柄handler的参数的类型和值。 <blockquote>

{@code
            T target(A..., B...);
            T handler(ExType, A...);
            T adapter(A... a, B... b) {
              try {
                return target(a..., b...);
              } catch (ExType ex) {
                return handler(ex, a...);
              }
            }
            }

</blockquote> 注意,保存的参数(a... 在伪代码中)无法通过执行目标来修改,因此,如果调用处理程序,则从调用方传递到处理程序保持不变。

即使处理程序始终引发,目标和处理程序也必须返回相同的类型。 (例如,这种情况可能发生,因为处理程序正在模拟子 finally 句)。 若要创建此类引发处理程序,请编写 #throwException throwException处理程序创建逻辑,以便创建正确返回类型的方法句柄。

适用于 . 的 java.lang.invoke.MethodHandles.catchException(java.lang.invoke.MethodHandle, java.lang.Class<? extends java.lang.Throwable>, java.lang.invoke.MethodHandle)Java 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

适用于