MethodHandles.TryFinally(MethodHandle, MethodHandle) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Convierte un identificador de método que adapta un target identificador de método encapsulandolo en un try-finally bloque.
[Android.Runtime.Register("tryFinally", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)]
public static Java.Lang.Invoke.MethodHandle? TryFinally(Java.Lang.Invoke.MethodHandle? target, Java.Lang.Invoke.MethodHandle? cleanup);
[<Android.Runtime.Register("tryFinally", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)>]
static member TryFinally : Java.Lang.Invoke.MethodHandle * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle
Parámetros
- target
- MethodHandle
identificador cuya ejecución se va a encapsular en un try bloque.
- cleanup
- MethodHandle
identificador que se invoca en el bloque finally.
Devoluciones
un identificador de método que incorpora el try-finally bloque compuesto por los dos argumentos.
- Atributos
Comentarios
Convierte un identificador de método que adapta un target identificador de método encapsulandolo en un try-finally bloque. Otro identificador de método, cleanup, representa la funcionalidad del finally bloque. Cualquier excepción producida durante la ejecución del target identificador se pasará al cleanup identificador. La excepción se volverá a iniciar, a menos que cleanup el identificador produzca primero una excepción. El valor devuelto desde la cleanup ejecución del identificador será el resultado de la try-finally ejecución del identificador.
El cleanup identificador se pasará uno o dos argumentos iniciales adicionales. La primera es la excepción que se produce durante la ejecución del target identificador o null si no se produjo ninguna excepción. El segundo es el resultado de la ejecución del target identificador o, si produce una excepción, se proporciona un nullvalor , cero o false del tipo necesario como marcador de posición. El segundo argumento no está presente si el target identificador tiene un void tipo de valor devuelto. (Tenga en cuenta que, excepto para las conversiones de tipo de argumento, los combinadores representan void valores en listas de parámetros omitiendo los argumentos paradójicos correspondientes, no insertando null o cero valores).
Los target identificadores y cleanup deben tener el mismo argumento y tipos devueltos correspondientes, excepto que el cleanup identificador puede omitir argumentos finales. Además, el cleanup identificador debe tener uno o dos parámetros iniciales adicionales:<ul><li>, Throwableque llevará la excepción producida por el target identificador (si existe); y <li>un parámetro del mismo tipo que el tipo de valor devuelto de y targetcleanup, que llevará el resultado de la ejecución del target identificador. Este parámetro no está presente si target devuelve void.
</ul>
El pseudocódigo del adaptador resultante tiene el siguiente aspecto. En el código, V representa el tipo de resultado de la try/finally construcción; A/a, los tipos y valores de argumentos para el controlador resultante consumido por la limpieza; y B/b, los de argumentos al identificador resultante descartado por la limpieza.
<blockquote>
{@code
V target(A..., B...);
V cleanup(Throwable, V, A...);
V adapter(A... a, B... b) {
V result = (zero value for V);
Throwable throwable = null;
try {
result = target(a..., b...);
} catch (Throwable t) {
throwable = t;
throw t;
} finally {
result = cleanup(throwable, result, a...);
}
return result;
}
}
</blockquote>
Tenga en cuenta que los argumentos guardados (a... en el pseudocódigo) no se pueden modificar mediante la ejecución del destino y, por tanto, se pasan sin cambios del autor de la llamada a la limpieza, si se invoca.
El destino y la limpieza deben devolver el mismo tipo, incluso si la limpieza siempre se produce. Para crear este tipo de limpieza, componga la lógica de limpieza con #throwException throwException, para crear un identificador de método del tipo de valor devuelto correcto.
Tenga en cuenta que tryFinally nunca convierte excepciones en devoluciones normales. En casos poco frecuentes en los que se deben convertir excepciones de esa manera, encapsula primero el destino con #catchException(MethodHandle, Class, MethodHandle) para capturar una excepción saliente y, a continuación, encapsular con tryFinally.
Se recomienda declarar el primer tipo de parámetro en lugar de cleanupThrowable un subtipo más estrecho. Esto garantiza cleanup que siempre se invocará con cualquier excepción que target se produzca. Declarar un tipo más estrecho puede dar lugar a que el try-finally identificador produzca un ClassCastException error si el tipo de la excepción iniciada por target no se puede asignar al primer tipo de parámetro de cleanup. Tenga en cuenta que casi cualquier tipo de código de Java puede producir varios tipos de excepciones de VirtualMachineError, LinkageErrory RuntimeException una cláusula finally que captura (por ejemplo) solo IOException enmascararía a cualquiera de los demás detrás de .ClassCastException
Agregado en 9.
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el Android y se usan según los términos descritos en creative Creative Commons 2.5 Attribution License.