Java,返回新的MyException:反模式?

时间:2012-03-07 14:01:58

标签: java exception exception-handling

在我的课堂上,我正在验证自定义数据。许多条件适用。如果失败,我想抛出一个特定的MyException。抛出此MyException需要许多常用参数和一个自定义参数(基于实际的失败)。因此,实际的抛出会因为代码重复而需要编写许多字符并破坏整洁。我也要扔太多次了。我决定创建一个私有方法,准备并返回此MyException的新实例,并将唯一的自定义数据作为参数,因此代码可以更清晰。

private MyException createMyException(final CustomErrorData errorData)
{
... some info gathering, parameterizing, etc... 
return new MyException(errorData);
}

...

所以抛出一个新的MyException要短得多:

throw createMyException(errorData);

我的问题是:在这种情况下,防止代码重复的正确做法是什么?我可能会过度假设异常。

5 个答案:

答案 0 :(得分:2)

异常工厂 - 从未见过它,但至少它听起来就像一个合适的设计。

我只是担心 - 您似乎在设计异常抛出框架方面投入了大量精力:向异常添加参数,状态等。您是否真的在代码中遇到许多特殊条件?或者,如果正确处理预期的条件,会抛出异常吗?

通常抛出的异常是“仅用于日志”。发生的事情在当前的背景下不应该发生。有些东西,开发人员应该在下一个版本中知道并纠正。我们不应该使用异常来处理预期的状态。

因此,在调查精彩的异常创建代码之前,请仔细检查是否值得付出努力,或者您的应用程序的设计是否开始变得......太有创意了。

答案 1 :(得分:1)

如果您有一种常规类型的例外,您将失去OOP的一些优势。

您不必为特定异常类型设置try-catch,而是必须拥有一般异常的catch,然后根据MyException类中的某些字段继续处理。

你会有这样的事情:

try{
    //code here
}
catch (MyException ex){
  switch(ex.exceptionType){
     case IOException: doSomething();break;
     case ConnectionException:doSomethingElse();break;
     default: //throw the exception outwards if you don't want to process it
 }
}

相反,你应该有像

这样的东西
try{
    //code here
}
catch (IOException ex){
    doSomething();
    }
catch (ConnectionException ex){
    doSomethingElse();
}

更明确,更多OOP。

为什么你将所有异常置于一般类型之下是一个难题,就像让所有对象只是一个类的实例一样,但你需要基于某些标志的不同行为。

答案 2 :(得分:0)

Imho你的助手功能非常好,我没有看到另一种方法在这里更适合..

答案 3 :(得分:0)

我会在方法中抛出异常,除非这会混淆编译器。

private void throwMyException(final CustomErrorData errorData) {
... some info gathering, parameterizing, etc... 
    throw new MyException(errorData);
}

throwMyException(errorData);

private MyException throwMyException(final CustomErrorData errorData) {
... some info gathering, parameterizing, etc... 
    throw new MyException(errorData);
}

throwMyException(errorData);
// or if the compiler complains
throw throwMyException(errorData);

答案 4 :(得分:0)

我将这两个问题分开了。您的班级知道如何收集信息,但不应该知道异常(该信息的用户)。

首先定义一个创建CustomErrorData实例的方法:

private CustomErrorData createCustomErrorData() {
    // info gathering
    return new CustomErrorData(something);
}

然后为使用CustomErrorData

的异常定义构造函数
public MyException(CustomErrorData errorData) {
    // save it as a field
}

然后

throw new MyException(createCustomErrorData());

你需要的地方。

这也允许您将CustomErrorData用于其他内容,可能是记录,向用户显示,等等。