MethodHandles.CatchException(MethodHandle, Class, MethodHandle) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
通过在异常处理程序中运行它,使方法句柄适应目标方法句柄。
[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
表示生成的适配器的target
handler
返回类型,以及结果适配器的返回类型;A
a
/以及由生成的句柄使用的自变量的类型和值;以及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
处理程序创建逻辑,以便创建正确返回类型的方法句柄。
本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。