首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AggregateException C#示例

AggregateException C#示例
EN

Stack Overflow用户
提问于 2011-07-20 07:56:34
回答 5查看 71.7K关注 0票数 31

我在网上看到了一个AggregateException的例子,我正在尝试弄清楚它是如何工作的。我已经写了一个简单的例子,但是我的代码由于某种原因不能工作。

有人能给我解释一下问题出在哪里吗?

代码语言:javascript
复制
public static void Main()
{
    try
    {
        Parallel.For(0, 500000, i =>
        {
            if (i == 10523)
                throw new TimeoutException("i = 10523");
            Console.WriteLine(i + "\n");
        });
    }
    catch (AggregateException exception)
    {
        foreach (Exception ex in exception.InnerExceptions)
        {
            Console.WriteLine(ex.ToString());
        }
    }
}
EN

回答 5

Stack Overflow用户

发布于 2017-06-06 06:11:02

您需要在内部异常上调用Handle。来自Handle上的MSDN's documentation

谓词的每次调用都返回true或false,以指示是否处理了异常。在所有调用之后,如果有任何异常未被处理,则所有未处理的异常都将被放入一个将被抛出的新AggregateException中。否则,Handle方法只是返回。如果谓词的任何调用抛出异常,它将暂停任何其他异常的处理,并立即按原样传播抛出的异常。

示例代码也来自MSDN:

代码语言:javascript
复制
public static void Main()
{
    var task1 = Task.Run(() => { throw new CustomException("This exception is expected!"); });

    try 
    {
        task1.Wait();
    }
    catch (AggregateException ae)
    {
        // Call the Handle method to handle the custom exception,
        // otherwise rethrow the exception.
        ae.Handle(ex => 
        { 
            if (ex is CustomException)
                Console.WriteLine(ex.Message);
            return ex is CustomException;
        });
    }
}
票数 26
EN

Stack Overflow用户

发布于 2011-07-20 08:02:13

当使用并行时,“作业”(这里从0到500000)被拆分到几个工作线程上。这些方法中的每一个都可能引发异常。在示例中,异常被编码为在处理10523的线程中发生。在现实世界的场景中,可能会发生不止一个异常(在不同的线程中)- AggregateException只是一个“容器”,用于存储并行运行时发生的所有异常,因此您不会丢失任何异常……

票数 15
EN

Stack Overflow用户

发布于 2014-10-22 21:26:22

AggregateException通常用于捕获异常,这些异常可能在等待Task完成时发生。因为Task通常可以由多个其他异常组成,所以我们不知道是否会抛出一个或多个异常。

检查以下示例:

代码语言:javascript
复制
// set up your task
Action<int> job = (int i) =>
{
    if (i % 100 == 0)
        throw new TimeoutException("i = " + i);
};

// we want many tasks to run in paralell
var tasks = new Task[1000];
for (var i = 0; i < 1000; i++)
{
    // assign to other variable,
    // or it will use the same number for every task
    var j = i; 
    // run your task
    var task = Task.Run(() => job(j));
    // save it
    tasks[i] = task;
}

try
{
    // wait for all the tasks to finish in a blocking manner
    Task.WaitAll(tasks);

}
catch (AggregateException e)
{
    // catch whatever was thrown
    foreach (Exception ex in e.InnerExceptions)
        Console.WriteLine(ex.Message);
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6755541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档