如何刻意抛出RuntimeException?

时间:2014-10-10 12:43:48

标签: java exception apache-storm

假设我的拓扑结构很简单:

Spout --> Bolt A --> Bolt B --> Bolt C

Bolt C将数据存储在数据存储区中。

现在建议在存储数据时出现异常时抛出RuntimeException? 类似的东西:

try {
    datastoreManager.insert(myData);
} catch (Exception e) {
    throw new RuntimeException(e);
}

或者我应该抛出一个FailedException并让拓扑重试那个元组吗?

什么是好的做法?

我没有看到故意在这里抛出RuntimeException有什么害处,因为当发生这种情况时,当前工作线程死亡,并且由于拓扑没有收到ACK,元组将在其他一些工作者上重新尝试,通过抛出FailedException 除了以获得拓扑上的某些增强负载,产生相同的总输出。

3 个答案:

答案 0 :(得分:0)

考虑从RuntimeException扩展

public DataException extends RuntimeException {
}

try {
    datastoreManager.insert(myData);
} catch (Exception e) {
    throw new DataException(e);
}

现在,调用层次结构中的上述类可以选择捕获此特定异常或让它传播。

由于未经检查,您可能希望在java doc中添加足够的文档,以便让调用者期望RuntimeException

答案 1 :(得分:0)

您希望更深入地了解抛出的异常类型。如果它是瞬态的,就像连接错误一样,您可以抛出FailedException并让拓扑重放它。但是,您不希望这样做会出现需要别人注意修复的错误。在这种情况下,您希望抛出自定义错误,提供足够的信息来解决问题 - http://bugroll.com/how-to-write-good-error-messages.html

答案 2 :(得分:0)

我不了解您系统的要求以及正确的语义。但我是你,我不会抛出异常。我要做的是:如果抛出异常,我会抓住并将{strong> 的身份myData保存到持久性存储中(例如Apache kafka或JBoss HornetQ)。

在分析出现问题后,您可以回复您的活动。

同样,如果您的系统需要更严格的语义,则可能无法接受。