java异常从业务层集中抛出,是不是每个控制层方法都要try catch

java开发中,DAO层的方法有许多判断,异常从DAO层集中抛出,比如说UserDao在进行添加用户(add(sql,Object o))时会判断,当sql为空时抛出了自定义异常MyException("sql为空"),这时如果UserService addUser()调用了这个add方法,那么UserService必须要捕获这个自定义异常然后抛给控制层,然后控制层再进行处理吗,这是否有些太繁琐了,感觉平时大家是不会这么处理的,但是不处理Dao层抛出的那个异常程序又会中断,影响使用效果,大家都是怎么做的啊??

根据你的业务需要来处理。
比如注册用户这个逻辑,在jdbc层丢出一个sqlexception,重复主键的异常,你的dal应该丢出“记录重复”这样的异常,而到了你的业务逻辑层,应该丢出“重复的用户名”,再到你的界面,就不丢出异常,而是显示一个错误提示给用户,当前用户名已经注册。

所谓异常,就是指意外情况,也就是你代码中没有考虑的状况。比如对于jdbc来说,sqlexception是异常,但是对于你的dao来说,你可以预料到这个异常的发生,所以它本身不是异常,不上抛,而记录重复应该怎么处理,才是无法意料的事情,所以才丢出重复记录的异常。

dao层用try catch 其他的不用,不会抛给其他层

异常到底应该抛出还是捕获是依赖于业务的,没有定论。
内层抛出的异常,如果不进行捕获,会沿调用链一路抛出到Controller,框架,中间件。
为了减少冗余代码,我们系统采用的是不同业务抛出不同的异常类,然后在公共部分(Spring的HandlerExceptionResolver)拿到所有的异常,然后根据异常类型区分处理逻辑。这样,在写业务代码的时候,可以不需要过于关注异常的处理,达到解耦的作用。
需要从内层带出的上下文,可以作为异常类的域一并带出,并且在公共部分记录异常的信息和堆栈也更利于定向排查错误。
不过,这样就要求异常在抛出过程中不能被转换为其他类型——或者在拿到异常的时候递归调用getCause取得原始异常。RMI、EJB等都会令异常类型发生变化,需要注意。