首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPars forkOffChild异常处理

GPars forkOffChild异常处理
EN

Stack Overflow用户
提问于 2012-11-16 05:26:33
回答 1查看 418关注 0票数 1

我使用的是GPars的fork/join。当我在调用forkOffChild之后抛出一个异常时,它就被埋没了。

例如:

代码语言:javascript
复制
def myRecursiveClosure = { boolean top ->
    try {
        if (!top) {
            throw new RuntimeException('child had a problem')
        } else {
            forkOffChild(false)
        }
    } catch (Exception exc) {
        println 'Exception handled internally'
        throw exc
    }
}

try {
     GParsPool.withPool {
         GParsPool.runForkJoin(true, myRecursiveClosure)
    }
} catch (Exception exc) {
     println 'Exception handled externally'
     throw exc
}

这里,我设置了一个标志,这样我就知道闭包已经被递归调用了。然后,我抛出一个异常,它被“内部”捕获,但重新抛出的异常永远不会被“外部”捕获。所以我不知道派生的孩子失败了。

我也尝试了异常处理程序,但它似乎也没有被调用。

这是意料之中的行为,还是我做错了什么?有什么策略可以帮助你做到这一点吗?我不能让孩子默默地失败。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-16 18:45:10

这里最重要的一点是,forkOffChild()不会等待孩子运行。它只是调度它来执行。因此,您不能期望forkOffChild()方法从子对象传播异常,因为它们很可能在父对象从forkOffChild()方法返回之后很久才发生。

但是,通常情况下,父级对子计算的结果感兴趣,因此在派生之后的某个时刻,它会使用getChildrenResults()方法收集结果。这会返回一个计算值列表,或者重新抛出潜在的异常。

此代码片段显示了获得预期行为所需的最小更改:

代码语言:javascript
复制
   try {
        if (!top) {
            throw new RuntimeException('child had a problem')
        } else {
            forkOffChild(false)
            println childrenResults
        }
    } catch (Exception exc) {
        println 'Exception handled internally'
        throw exc
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13406515

复制
相关文章

相似问题

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