比如在业务层中添加用户,会有用户查重处理,如果发现有重复数据,需要告诉上一层。
看了很多koa错误处理的文章,大多都建议直接在代码中抛出自定义异常,然后在中间件统一捕获处理。但是在程序中很多非程序性错误,例如上面的查重,上一层可能需要有其他处理,如果抛出了异常则需要在上一层捕获。 但是这样同样会捕获到程序性异常,例如数据库连接失败之类的。这样一来我们就需要在catch中判断类型是否是自定义异常,再做对应的处理,如果不是自定义异常再抛出。
这样的处理方式我总感觉挺别扭的,逻辑错误和程序错误感觉搅在一堆了。之前我的做法是在业务层统一返回一个ResultModel,里面包含了对应的正确码或者 逻辑错误码。这种方式避免了程序错误和逻辑错误混淆,程序错误同样在中间件统一处理,逻辑处理则按正常流程处理。
请问各位童鞋觉得这种处理方式是否正确?有更好的处理方式吗?
错误处理middleware只处理非业务性异常这点我也赞同,类似404,500,数据库连接超时这种错误就放在中间件做。
业务层的异常处理要看具体情况,我个人的看法是,比较低级别的调用,比如只是调用一个计算个人所得税的函数,这里面如果发生错误,直接抛出具体的异常即可,让它的调用者去处理,如果它的调用者层级也不高,可以再让这个调用者的调用者处理。总之,低级别的函数不能“吃掉”异常,应该把异常抛出给上一层代码处理。另外统一创建一个异常类,然后派生子类出来处理具体的异常也是不错的方法,可以在具体异常类中定义错误代码、具体出错信息、堆栈跟踪信息等。