2016-04-25 68 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()调用+引用您的扩展类的名称空间。

恐怕没有更简单的选择,并且总是需要某种程度的“手动陈述”。