处理具有异常vs流控制的方法参数

时间:2013-09-29 19:27:27

标签: java exception flow-control

在测试最终用户插入的参数时,使用异常或流量控制是否更好? 伪代码:

class A{
List listOfPeople;
public void insertName(String name)
{
//if the name is not inserted in the registry it throws a runtime exception
throw new IllegalArgumentException("Please insert a registered name");
}
}

或者最好做以下事情:

class A{
List listOfPeople;
public void insertName(String name)
{
if (!listOfPeople.contains(name){
System.out.println("name not in the list, please insert a registered name");
reInsertName();
}
else
..do stuff..
}
}

我已经知道抛出异常是非常昂贵的..这是否意味着只要有可能不抛出异常,我们就必须避免让它们试图控制流量来控制这个问题?

谢谢,确实是它

2 个答案:

答案 0 :(得分:0)

但是在你的第二个实现中你必须处理同一个类中的错误情况,我的意思是一个单独的错误处理程序模块是一个更好的方法,分离方面和应用类的单一责任是我认为更好的实现方式

答案 1 :(得分:0)

当API方法(即公共或受保护的)接收违反其合同的参数时,应抛出

IllegalArgumentException,例如如果参数为insertName或空字符串,则方法null可以抛出一个。

这些简单的检查放在开头,并且应该记录参数的约束。抛出异常以指示客户端代码中的错误(使用该方法的代码)。

在您的情况下,参数的约束更多地在业务逻辑方面,并且它们取决于程序状态(该名称先前已添加到某个列表中)。使用IllegalArgumentException表示程序状态无效似乎不正确。如果有,那么IllegalStateException在这里要好得多。

但我不会那样设计它。怎么样多OO:

public class A {

    List listOfPeople;

    public static class Registration {

        private final String name;            

        private Registration(String name) {
            this.name = name;
        }
        public void insert() {
            // ha, no need of exception throwing, because the person had to be registered first!
        }
    }

    public Registration register(String name) {
        listOfPeople.add(name);
        return new Registration(name);
    }
}