首页 > 后端开发 > C++ > 如何捕获 .NET 中单独线程引发的异常?

如何捕获 .NET 中单独线程引发的异常?

Mary-Kate Olsen
发布: 2025-01-06 00:49:39
原创
137 人浏览过

How Can I Catch Exceptions Thrown from a Separate Thread in .NET?

捕获不同线程中引发的异常:综合指南

本文解决了从调用者捕获单独线程中引发的异常的常见问题方法。当方法 (Method1) 生成新线程,并且在该线程 (Method2) 中执行期间发生异常时,就会出现问题。挑战在于将此异常信息传输回方法 1。

解决方案

在 .NET 4 及更高版本中,Task类提供了一个优雅的解决方案。通过使用此类,您可以:

1.在任务线程中单独处理异常

在这种方法中,您可以在任务线程中处理异常,如以下代码片段所示:

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);
    }
}
登录后复制

2.在调用者线程中处理异常

或者,您可以使用以下代码在调用者线程中处理异常:

class Program
{
    static void Main(string[] args)
    {
        Task<int> task = new Task<int>(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 解决方案

在 .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();
    }
}
登录后复制

以上是如何捕获 .NET 中单独线程引发的异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板