Linguaggio

MethodHandles.TryFinally(MethodHandle, MethodHandle) Metodo

Definizione

Crea un handle di metodo che adatta un target handle di metodo eseguendo il wrapping in un try-finally blocco.

[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

Parametri

target
MethodHandle

handle di cui eseguire il wrapping in un try blocco.

cleanup
MethodHandle

handle richiamato nel blocco finally.

Valori restituiti

handle di metodo che incorpora il try-finally blocco composto dai due argomenti.

Attributi

Commenti

Crea un handle di metodo che adatta un target handle di metodo eseguendo il wrapping in un try-finally blocco. Un altro handle di metodo, cleanup, rappresenta la funzionalità del finally blocco. Qualsiasi eccezione generata durante l'esecuzione dell'handle target verrà passata all'handle cleanup . L'eccezione verrà rigenerata, a meno che cleanup handle non generi prima un'eccezione. Il valore restituito dall'esecuzione cleanup dell'handle sarà il risultato dell'esecuzione dell'handle try-finally .

L'handle cleanup verrà passato uno o due argomenti iniziali aggiuntivi. Il primo è l'eccezione generata durante l'esecuzione dell'handle target o null se non è stata generata alcuna eccezione. Il secondo è il risultato dell'esecuzione dell'handle target o, se genera un'eccezione, viene fornito un nullvalore , zero o false del tipo richiesto come segnaposto. Il secondo argomento non è presente se l'handle target ha un void tipo restituito. Si noti che, ad eccezione delle conversioni dei tipi di argomento, i combinatori rappresentano void i valori negli elenchi di parametri omettendo gli argomenti paradossali corrispondenti, non inserendo null o zero valori.

Gli target handle e cleanup devono avere lo stesso argomento e gli stessi tipi restituiti, ad eccezione del fatto che l'handle cleanup può omettere gli argomenti finali. Inoltre, l'handle cleanup deve avere uno o due parametri iniziali aggiuntivi:<ul<>li>a Throwable, che conterrà l'eccezione generata dall'handle target (se presente) e <li>un parametro dello stesso tipo del tipo restituito di target e cleanup, che conterrà il risultato dall'esecuzione dell'handletarget. Questo parametro non è presente se restituisce targetvoid. </ul>

Lo pseudocodice per l'adattatore risultante è simile al seguente. Nel codice V rappresenta il tipo di risultato del try/finally costrutto; A/a, i tipi e i valori degli argomenti nell'handle risultante utilizzato dalla pulizia e B/b, quelli degli argomenti dell'handle risultante rimossi dalla pulizia. <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>

Si noti che gli argomenti salvati (a... nello pseudocodice) non possono essere modificati dall'esecuzione della destinazione e quindi vengono passati invariati dal chiamante alla pulizia, se viene richiamato.

La destinazione e la pulizia devono restituire lo stesso tipo, anche se la pulizia genera sempre . Per creare una pulizia di questo tipo, comporre la logica di pulizia con #throwException throwExceptionper creare un handle di metodo del tipo restituito corretto.

Si noti che tryFinally non converte mai le eccezioni in ritorni normali. In rari casi in cui le eccezioni devono essere convertite in questo modo, eseguire prima il wrapping della destinazione con #catchException(MethodHandle, Class, MethodHandle) per acquisire un'eccezione in uscita e quindi eseguire il wrapping con tryFinally.

È consigliabile dichiarare Throwable il primo tipo di cleanup parametro anziché un sottotipo più piccolo. In questo modo cleanup verrà sempre richiamato con qualsiasi eccezione generata target . La dichiarazione di un tipo più stretto può comportare la generazione di un'eccezione ClassCastException generata dall'handle try-finally se il tipo dell'eccezione generata da target non è assegnabile al primo tipo di parametro di cleanup. Si noti che vari tipi di eccezione di VirtualMachineError, LinkageErrore RuntimeException possono essere generati in linea di principio da quasi qualsiasi tipo di codice Java e una clausola finally che intercetta (ad esempio) maschera solo IOException uno degli altri dietro a .ClassCastException

Aggiunta in 9.

Documentazione java per java.lang.invoke.MethodHandles.tryFinally(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle).

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal progetto Open Source Android e usato in base ai termini descritti nella licenza Creative Commons 2.5 Attribuzione.

Si applica a