zoukankan      html  css  js  c++  java
  • Task中的异常处理

    最简单的方式

        var t = new Task(() => {
                    throw new Exception("unknow excption");
                });
                t.Start();
                try
                {
                    t.Wait();
                }
                catch (AggregateException e)
                {
                    foreach (var item in e.InnerExceptions)
                    {
                        Console.WriteLine("异常类型	{0}
    来自	{1}
    异常内容	{2}", item.GetType(), item.Source, item.Message);
                    }
                }    

    缺点:这个会阻塞当前线程。下面是改进版

    var t = new Task(() => {
                    throw new Exception("unknow excption");
                });
                t.Start();
                var cat = t.ContinueWith(task =>
                {
                    foreach (var item in task.Exception.InnerExceptions)
                    {
                        Console.WriteLine("异常类型	{0}
    来自	{1}
    异常内容	{2}", item.GetType(), item.Source, item.Message);
                    }
                }, TaskContinuationOptions.OnlyOnFaulted); //指定只应在延续任务前面的任务引发了未处理异常的情况下才安排延续任务
                Console.WriteLine("主线程退出");
                Console.ReadKey();

    缺点:异常没有回到主线程。继续改进

    var t = new Task(() => {
                    throw new Exception("unknow excption");
                });
                t.Start();
                var cat = t.ContinueWith(task =>
                {
                    throw task.Exception;
                }, TaskContinuationOptions.OnlyOnFaulted); //指定只应在延续任务前面的任务引发了未处理异常的情况下才安排延续任务
                Console.WriteLine("主线程退出");
                Thread.Sleep(1000);
                //异常处理
                try
                {
                    cat.Wait();
                }
                catch (AggregateException e)
                {
                    foreach (var item in e.InnerExceptions)
                    {
                        Console.WriteLine("异常类型	{0}
    来自	{1}
    异常内容	{2}", item.InnerException.GetType(), item.InnerException.Source, item.InnerException.Message);
                    }
                }
  • 相关阅读:
    Django drf 功能组件
    Django drf 视图家族
    Django drf初级
    Django drf序列化器 Serializer
    VUE 全整理
    Django Xadmin的安装方式
    python virtualenv虚拟环境搭建
    版本控制器:操作流程
    版本控制器:GIT线上操作
    《剑指offer》---跳台阶问题
  • 原文地址:https://www.cnblogs.com/goodspeed/p/4069968.html
Copyright © 2011-2022 走看看