Поделиться через


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 результирующего адаптера;aA/ типы и значения аргументов для результирующего дескриптора, потребляемого ; иb/B , те из аргументов в результирующий handlerдескриптор, отбрасываемый.handlerhandlertarget <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 для java.lang.invoke.MethodHandles.catchException(java.lang.invoke.MethodHandle, java.lang.Class<? extends java.lang.Throwable>, java.lang.invoke.MethodHandle).

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

Применяется к