首页 > 后端开发 > C++ > C#中如何捕获不同线程中抛出的异常?

C#中如何捕获不同线程中抛出的异常?

Linda Hamilton
发布: 2025-01-05 14:54:46
原创
236 人浏览过

How to Catch Exceptions Thrown in Different Threads in C#?

捕获不同线程中抛出的异常

在多线程编程中,处理除线程之外的线程中发生的异常可能具有挑战性主线程。当一个方法 (Method1) 生成一个新线程,并且该线程执行另一个引发异常的方法 (Method2) 时,就会出现此问题。问题是如何在 Method1 中捕获此异常。

.NET 4 及以上版本的解决方案

对于 .NET 4 及更高版本,Task;类提供了一个方便的解决方案。它允许您使用任务对象上的 .Exceptions 属性来获取异常。这里有两种方法:

  • 处理任务线程中的异常:

    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);
        }
    }
    登录后复制
  • 处理任务线程中的异常呼叫者主题:

    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 后,可以使用以下方法:

  • 子线程中的异常处理:

    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();
        }
    }
    登录后复制
  • 处理调用者的异常主题:

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

这些选项提供了在多线程场景中处理异常的灵活性,确保应用程序中强大的错误管理。

以上是C#中如何捕获不同线程中抛出的异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

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