2016-04-25 56 views
4

使用你必須要特別小心處理異常的任務,這裏有一個例子:內置異常處理的任務?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Task<int> task = new Task<int>(Test); 
     task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted); 
     task.Start(); 
     Console.ReadLine(); 
    } 

    static int Test() 
    { 
     throw new Exception(); 
    } 

    static void ExceptionHandler(Task<int> task) 
    { 
     var exception = task.Exception; 
     Console.WriteLine(exception); 
    } 
} 

here

我的問題是,如果有任何的方式來創建一個自定義任務,將處理(登錄到服務)所有異常,而無需由開發人員手動說明它?某種幫助遺產。

+0

您可以從['Task'](https://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v = vs.110).aspx)派生出來。也許在你創建的'Start()'方法的主體中調用'base.Start()'之前,調用'base.ContinueWith(ExceptionHandler,TaskContinuationOptions.OnlyOnFaulted);'定製任務類。 – Quantic

+0

我不確定我是否理解整個用例。但是,你可以嘗試冒泡異常,並在最高級別登錄。如果拋出異常,那麼它很可能意味着您的應用程序無論如何都處於不正確的狀態。 – Karolis

回答

0

您可以創建MyLoggingTask作爲Task的子類,實現與您相關的構造函數,或者所有這些函數都是安全的(我在.NET Framework 4.5中看到其中的8個),並覆蓋Start () 方法。

然後或者用MyLoggingTask +對你的子類名字空間的引用替換每個任務的使用,或者用using Task = Your.NameSpace.MyLoggingTask最小化'手動'方面,創建一個實際上是你自己的類的任務別名。

作爲一種替代方法,您可以創建一個擴展方法public static StartWithLogging<T>(this Task<T> task),其中負責ContinueWith。然後用StartWithLogging()替換每個Start()調用+引用您的擴展類的名稱空間。

恐怕沒有更簡單的選擇,並且總是需要某種程度的「手動陳述」。