• C#异常处理(转载)


    1.对于Thread操作的异常处理

    public static void Main()
    {
        try
        {
            Thread th = new Thread(DoWork);
            th.Start();
        }
        catch (Exception ex)
        {
            // Non-reachable code
            Console.WriteLine("Exception!");
        }
    }
    
    static void DoWork()
    {
        ……
        throw null;  // Throws a NullReferenceException 
    }

    在DoWork函数里抛出的异常时不会被主线程的try,catch捕捉的,各个线程应该有自己的try,catch去处理线程异常。
    正确写法:

    public static void Main()
    {
        Thread th = new Thread(DoWork);
        th.Start();
    }
    
    static void DoWork()
    {
        try
        {
            ……
            throw null;    // The NullReferenceException will be caught below
        }
        catch (Exception ex)
        {
            Typically log the exception, and/ or signal another thread
            that we've come unstuck
            ...
        }
    }

    2. 异步函数的异常处理
    例如如 WebClient中的 UploadStringAsync,它的异常会在UploadStringCompleted的参数error里

    static void Main(string[] args)
    {
        WebClient webClient = new WebClient();
        webClient.UploadStringCompleted += new UploadStringCompletedEventHandler((sender, e) =>
        {
            if (e.Error != null)
            {
                Console.WriteLine(e.Error.Message);
            }
        });
        webClient.UploadStringAsync(new Uri("http://www.baidu.com"), "1111");
        Console.ReadKey();
    }

    3 Task的异常处理
    把try包含task.wait()函数,就能捕捉task的异常

    Task task = Task.Run(() => { throw null; });
    try
    {
        task.Wait();
    }
    catch (AggregateException aex)
    {
        if (aex.InnerException is NullReferenceException)
            Console.WriteLine("Null!");
        else
            throw;
    }

    或者 在continue函数里处理TaskContinuationOptions.OnlyOnFaulted的状态

    Task<List<int>> taskWithFactoryAndState =
    Task.Factory.StartNew<List<int>>((stateObj) =>
    {
        List<int> ints = new List<int>();
        for (int i = 0; i < (int)stateObj; i++)
        {
            ints.Add(i);
            if (i > 100)
            {
                InvalidOperationException ex =
                    new InvalidOperationException("oh no its > 100");
                ex.Source = "taskWithFactoryAndState";
                throw ex;
            }
        }
        return ints;
    }, 2000);
    
    
    //and setup a continuation for it only on when faulted
    taskWithFactoryAndState.ContinueWith((ant) =>
    {
        AggregateException aggEx = ant.Exception;
        Console.WriteLine("OOOOPS : The Task exited with Exception(s)");
        foreach (Exception ex in aggEx.InnerExceptions)
        {
            Console.WriteLine(string.Format("Caught exception '{0}'",
                ex.Message));
        }
    }, TaskContinuationOptions.OnlyOnFaulted);
    
    //and setup a continuation for it only on ran to completion
    taskWithFactoryAndState.ContinueWith((ant) =>
    {
        List<int> result = ant.Result;
        foreach (int resultValue in result)
        {
            Console.WriteLine("Task produced {0}", resultValue);
        }
    }, TaskContinuationOptions.OnlyOnRanToCompletion);
    Console.ReadLine();

    4 c# 5.0 中的async ,await 异常捕捉

    static async Task ThrowAfter(int timeout, Exception ex)
    {
        await Task.Delay(timeout);
        throw ex;
    }
    
    static async Task MissHandling()
    {
        var t1 = ThrowAfter(1000, new NotSupportedException("Error 1"));
        try
        {
            await t1;
        }
        catch (NotSupportedException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
     
  • 相关阅读:
    /etc/fstab 文件如何填写(转)
    在linux下PHP和Mysql环境搞事情
    nginx 添加的配置信息
    查看服务器硬件信息
    Centos下的SVN搭建
    20170413B端业务访问故障排查思路
    快速搭建BIND服务,并实现解析
    零基础学python-19.1 列表解析与序列映射函数map
    零基础学python-18.10 函数式编程工具:filter和reduce
    零基础学python-18.9 序列映射函数:map
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/15188833.html
Copyright © 2020-2023  润新知