MethodHandles.CatchException(MethodHandle, Class, MethodHandle) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
藉由在例外狀況處理程式內執行方法句柄,讓方法句柄調整目標方法句柄。
[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
表示和handler
的target
傳回型別,並對應至所產生/a
A
配接器的傳回型別;、 自變數的型別和值,以及 所捨棄handler
之結果句柄/handler
B
b
的自變數型別和值。 <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
,以建立正確傳回型別的方法句柄。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。