MethodHandles.TryFinally(MethodHandle, MethodHandle) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
製作一個方法代柄,透過將某個方法代柄包裹在try-finally區塊中來適配。target
[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
參數
- target
- MethodHandle
執行時要包裹在 try 區塊中的 handle。
- cleanup
- MethodHandle
在 final 區塊中被調用的 handle。
傳回
一個包含 try-finally 由兩個參數組成的區塊的方法控制柄。
- 屬性
備註
製作一個方法代柄,透過將某個方法代柄包裹在try-finally區塊中來適配。target 另一個方法的 handle, cleanup代表該 finally 區塊的功能。 在執行 target handle 時拋出的任何例外都會傳給 handle。cleanup 例外會被重新拋出,除非 cleanup handle 先拋出例外。 從句柄執行中回傳 cleanup 的值將是該句柄執行 try-finally 的結果。
cleanup帳號會被傳遞一到兩個額外的引向參數。 第一種是在執行 target handle 時拋出的例外,或 null 是如果沒有拋出例外。 第二個是執行 target 該句柄的結果,若拋出例外,則 null提供所需型態的 、 、 或 false 值作為佔位符。 若 target handle 具有 void 回傳型別,則第二個參數不存在。 (請注意,除了參數型別轉換外,組合子 void 在參數列表中表示值時會省略對應的悖論參數,而非插入 null 或零值。)
target和 cleanup handle 必須有相同的對應參數與回傳類型,但 cleanup handle 可以省略尾隨參數。 此外,cleanup句柄必須有一到兩個額外的前導參數:<ul<>li>a Throwable,將攜帶柄拋出的target例外(若有的話);以及 <li>,與 和 的回傳類型targetcleanup相同類型的參數,將攜帶柄執行target的結果。 若返回 targetvoid,則不存在此參數。
</ul>
所產生的轉接器偽代碼如下。 在程式碼中,代表V結構的try/finally結果型別;aA/、、是被清理消耗的對結果句柄的參數型別與值;而 B/b,則是被清理時丟棄的結果句柄的參數。
<引用>
{@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;
}
}
</區塊引用>
請注意,儲存的參數(a... 偽程式碼中)無法透過目標執行修改,因此若被呼叫,則會不改變地從呼叫者傳遞給清理。
目標和清理必須回彈相同類型,即使清理總是投擲。 要建立這樣的拋出清理,將清理邏輯組合為 #throwException throwException,以建立正確回傳類型的方法句柄。
請注意,該系統 tryFinally 從未將例外轉換成正常退貨。 在罕見情況下,例外必須以此方式轉換,先將目標#catchException(MethodHandle, Class, MethodHandle)包裹以捕捉出出異常,然後再包裹 。tryFinally
建議先宣Throwable告第一個參數類型cleanup,而非較窄的子類型。 這樣可以確保 cleanup 無論拋出什麼例外 target ,都會被調用。 宣告較窄型別可能會導致 ,ClassCastExceptiontry-finally若 所target拋出的例外類型無法指派給 的cleanup第一個參數類型。 請注意,LinkageErrorRuntimeException原則上幾乎任何類型的 Java 程式碼都可以拋出各種例外類型VirtualMachineError,而只捕捉(例如)IOException的 final 子句會將其他例外都隱藏在 ClassCastException。
新增9。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。