栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

捕获在不同线程中引发的异常

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

捕获在不同线程中引发的异常

.NET 4
及更高版本中,您可以使用

Task<T>
class而不是创建新线程。然后,您可以使用
.Exceptions
任务对象上的属性获取异常。有两种方法可以做到这一点:

  1. 在单独的方法中://您在某些 任务的 线程中处理异常

    class Program

    {
    static void Main(string[] args)
    {
    Task task = new Task(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);}

    }

  2. 用相同的方法://您在 调用者的 线程中处理异常

    class Program

    {
    static void Main(string[] args)
    {
    Task task = new Task(Test);
    task.Start();

        try    {        task.Wait();    }    catch (AggregateException ex)    {        Console.WriteLine(ex);        }    Console.ReadLine();}static int Test(){    throw new Exception();}

    }

请注意,您得到的异常是

AggregateException
。所有实际的异常都可以通过
ex.InnerExceptions
属性获得。

.NET 3.5中, 您可以使用以下代码:

  1. //您在 线程中处理异常

    class Program

    {
    static void Main(string[] args)
    {
    Exception exception = null;
    Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), Handler));
    thread.Start();

        Console.ReadLine();}private static void Handler(Exception exception){ Console.WriteLine(exception);}private static void SafeExecute(Action test, Action<Exception> handler){    try    {        test.Invoke();    }    catch (Exception ex)    {        Handler(ex);    }}static void Test(int a, int b){    throw new Exception();}

    }

  2. 或//您在 调用者的 线程中处理异常

    class Program

    {
    static void Main(string[] args)
    {
    Exception exception = null;
    Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), out exception));

        thread.Start();    thread.Join();    Console.WriteLine(exception);    Console.ReadLine();}private static void SafeExecute(Action test, out Exception exception){    exception = null;    try    {        test.Invoke();    }    catch (Exception ex)    {        exception = ex;    }}static void Test(int a, int b){    throw new Exception();}

    }



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576161.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号