在我的课堂上,我正在验证自定义数据。许多条件适用。如果失败,我想抛出一个特定的MyException。抛出此MyException需要许多常用参数和一个自定义参数(基于实际的失败)。因此,实际的抛出会因为代码重复而需要编写许多字符并破坏整洁。我也要扔太多次了。我决定创建一个私有方法,准备并返回此MyException的新实例,并将唯一的自定义数据作为参数,因此代码可以更清晰。
private MyException createMyException(final CustomErrorData errorData)
{
... some info gathering, parameterizing, etc...
return new MyException(errorData);
}
...
所以抛出一个新的MyException要短得多:
throw createMyException(errorData);
我的问题是:在这种情况下,防止代码重复的正确做法是什么?我可能会过度假设异常。
答案 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
用于其他内容,可能是记录,向用户显示,等等。