博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
挑战常规--不要这样使用异常
阅读量:5308 次
发布时间:2019-06-14

本文共 1889 字,大约阅读时间需要 6 分钟。

不要这样使用异常

在一些使用spring框架的项目中,经常可以看到这样的代码:

在业务代码中抛出自定义异常,在全局异常控制中自定义输出

@RestController@RequestMapping("/api/TestServer")public class TestServer{    @PostGet("getUser")    public User getUser(String userName)    {        //....                throw new UserNotFoundException();    }    //....}
public class UserNotFoundException extends RuntimeException{    public UserNotFoundException(){        super("用户不存在");    }}
@RestControllerAdvicepublic class MyExceptionHandler{    @ExceptionHandler    Map handleUserNotFoundException(UserNotFoundException ex)    {        Map result=new HashMap();        result.put("code",100);        result.put("message","用户不存在");        return result;    }    //...}

为什么说这不是一个好的做法呢?先看看正确的做法应该是:

定义全局输出封装类,正常或异常业务输出都由这个类封装

public class Message
{ /** * 响应代码,0为正常 */ private int code; /** * 用于描述code对应信息 */ private String msg; //.....}

定义一个基础常规异常表

public enum CodeEnu implements CodeInter {    /**正常返回*/OK,     /**未知异常时,最后返回*/OTHER("其他异常"),     NOTEMPTY("参数不能为空"), FORMATERROR("参数格式不正确"), //....}

替换抛出异常的业务代码

@RestController@RequestMapping("/api/TestServer")public class TestServer{    @PostGet("getUser")    public Message
getUser(String userName) { //.... return Message.error(CodeEnu.USER_NOTFOUND_ERROR); } //....}
@RestControllerAdvicepublic class MyExceptionHandler{    @ExceptionHandler    Message
handleException(Exception ex) { return Message.error(CodeEnu.OTHER); }}

抛出异常 vs 返回结果

有时候我们选择抛出异常,有时候选择返回结果。这要这两个者的优缺点说起:

  1. 异常能够详细的跟踪错误出处
  2. 抛出异常也意味着降低些性能

在业务中,抛出异常不好的点有:1.不需要详细的跟踪错误,最终也只是输出简要信息。2.是可预知的业务结果,而不是出现运行问题。3.重复的处理转发,由结果转异常抛出,再将异常抛出转结果输出,转了一圈又回来的浪费性能处理。

思考

  1. 在jdk8中,提供java.util.Optional 类也是用来减少抛出NullPointerException
  2. 经常需要用到将InputStream 读取出来的工具方法,如读取网络、文件,那么这个方法该抛出IOException还是返回null?

转载于:https://www.cnblogs.com/loveheihei/p/11315036.html

你可能感兴趣的文章
研磨JavaScript系列(五):奇妙的对象
查看>>
面试题2
查看>>
selenium+java iframe定位
查看>>
P2P综述
查看>>
第五章 如何使用Burp Target
查看>>
Sprint阶段测试评分总结
查看>>
sqlite3经常使用命令&语法
查看>>
linux下编译openjdk8
查看>>
【python】--迭代器生成器装饰器
查看>>
Pow(x, n)
查看>>
安卓当中的线程和每秒刷一次
查看>>
每日一库:Modernizr.js,es5-shim.js,es5-safe.js
查看>>
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
属性动画
查看>>
标识符
查看>>