環境:.NET Framework 4.0 RC 1。NativeActivity 透過 NativeActivityContext.ScheduleActivity() 調度子活動,其中一個多載接受 FaultCallback 委派,用於處理子活動拋出的未捕獲例外。
public sealed class MyActivity : NativeActivity {
public Activity Body { get; set; }
protected override void Execute(NativeActivityContext context) {
context.ScheduleActivity(Body, FaultHandler);
}
private void FaultHandler(NativeActivityFaultContext faultContext,
Exception propagatedException,
ActivityInstance propagatedFrom) {
Console.WriteLine(propagatedException.Message);
faultContext.HandleFault(); // 標記錯誤已處理
}
}
測試工作流:外層 Sequence → MyActivity(內層 Sequence: WriteLine → Throw → WriteLine) → WriteLine。
預期:Throw 後內層第二個 WriteLine 不執行,外層結束 WriteLine 執行。
實際:內層第二個 WriteLine 仍然執行!類似 VB6 On Error Resume Next 行為。

NativeActivityFaultContext.CancelChild(ActivityInstance) 明確取消發生錯誤的子活動實例,防止後續節點繼續執行。
private void FaultHandler(NativeActivityFaultContext faultContext,
Exception propagatedException,
ActivityInstance propagatedFrom) {
Console.WriteLine(propagatedException.Message);
faultContext.HandleFault();
faultContext.CancelChild(propagatedFrom); // 關鍵:取消錯誤來源活動
}
加上此行後,工作流行為符合預期:錯誤發生點後的同層級活動被取消,控制權返回父活動繼續執行。