MethodHandles.TryFinally(MethodHandle, MethodHandle) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Erstellt ein Methodenhandle, das ein target Methodenhandle anpasst, indem es in einen try-finally Block eingeschlossen wird.
[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
Parameter
- target
- MethodHandle
das Handle, dessen Ausführung in einen try Block eingeschlossen werden soll.
- cleanup
- MethodHandle
das Handle, das im letzten Block aufgerufen wird.
Gibt zurück
Eine Methode behandelt den Block, der try-finally aus den beiden Argumenten besteht.
- Attribute
Hinweise
Erstellt ein Methodenhandle, das ein target Methodenhandle anpasst, indem es in einen try-finally Block eingeschlossen wird. Ein weiteres Methodenhandle, cleanupstellt die Funktionalität des finally Blocks dar. Jede Ausnahme, die während der Ausführung des target Handles ausgelöst wird, wird an das cleanup Handle übergeben. Die Ausnahme wird erneut ausgelöst, es sei denn cleanup , die Behandlung löst zuerst eine Ausnahme aus. Der von der cleanup Ausführung des Handles zurückgegebene Wert ist das Ergebnis der Ausführung des try-finally Handles.
Der cleanup Handle wird ein oder zwei zusätzliche führende Argumente übergeben. Die erste Ausnahme wird während der Ausführung des target Handles ausgelöst, oder null wenn keine Ausnahme ausgelöst wurde. Die zweite ist das Ergebnis der Ausführung des target Handles oder, wenn eine Ausnahme ausgelöst wird, wird ein , null nulloder false wert des erforderlichen Typs als Platzhalter angegeben. Das zweite Argument ist nicht vorhanden, wenn das target Handle einen void Rückgabetyp aufweist. (Beachten Sie, dass Kombinationszeichen mit Ausnahme von Argumenttypkonvertierungen Werte in Parameterlisten darstellen void , indem die entsprechenden paradoxen Argumente weggelassen werden, nicht durch Einfügen null oder Nullwerte.)
cleanup Die target Ziehpunkte müssen dasselbe entsprechende Argument und dieselben Rückgabetypen aufweisen, mit der Ausnahme, dass das cleanup Handle nachfolgende Argumente auslassen kann. Darüber hinaus muss der cleanup Handle ein oder zwei zusätzliche führende Parameter aufweisen:<ul><li>a Throwable, die die Vom Handle ausgelöste target Ausnahme (falls vorhanden) <und li>einen Parameter desselben Typs wie der Rückgabetyp von beidem target aufweisen und cleanupdie das Ergebnis aus der Ausführung des target Handles tragen. Dieser Parameter ist nicht vorhanden, wenn der target Wert zurückgegeben wird void.
</ul>
Der Pseudocode für den resultierenden Adapter sieht wie folgt aus. Im Code V stellt den Ergebnistyp des try/finally Konstrukts dar;/Aa , die Typen und Werte von Argumenten für das resultierende Handle, das von der Bereinigung verbraucht wird; und B/bdie Argumente des resultierenden Handles, das von der Bereinigung verworfen wird.
<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>
Beachten Sie, dass die gespeicherten Argumente (a... im Pseudocode) nicht durch Ausführung des Ziels geändert werden können und daher unverändert vom Aufrufer an die Bereinigung übergeben werden, wenn sie aufgerufen wird.
Das Ziel und die Bereinigung müssen denselben Typ zurückgeben, auch wenn die Bereinigung immer ausgelöst wird. Zum Erstellen eines solchen Auslösens der Bereinigung erstellen Sie die Bereinigungslogik mit #throwException throwException, um ein Methodenhandle des richtigen Rückgabetyps zu erstellen.
Beachten Sie, dass tryFinally Ausnahmen niemals in normale Rückgaben konvertiert werden. In seltenen Fällen, in denen Ausnahmen auf diese Weise konvertiert werden müssen, schließen Sie zuerst das Ziel mit #catchException(MethodHandle, Class, MethodHandle) der Erfassung einer ausgehenden Ausnahme um, und schließen Sie dann mit tryFinally.
Es wird empfohlen, dass der erste Parametertyp cleanup anstelle eines schmaleren Untertyps deklariert Throwable wird. Dadurch wird sichergestellt, dass cleanup immer eine Ausnahme aufgerufen wird, die target ausgelöst wird. Das Deklarieren eines schmaleren Typs kann dazu führen ClassCastException , dass vom try-finally Handle ausgelöst wird, wenn der Typ der ausgelösten Ausnahme target nicht dem ersten Parametertyp zugewiesen cleanupwerden kann. Beachten Sie, dass verschiedene Ausnahmetypen von VirtualMachineError, LinkageErrorund RuntimeException im Prinzip durch fast jede Art von Java Code ausgelöst werden können, und eine abschließende Klausel, die nur die anderen hinter einem ClassCastExceptionFangen (sagen) IOException maskieren würde.
Hinzugefügt in 9.
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.