SpringMVC的Controller层方法为什么要抛异常

时间:2021-12-25 09:24:35
抛异常不是让进程终止了吗?
我在阅读一段线上代码的时候:
@RestController
@RequestMapping("")
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private TokenManager tokenManager;

    /**
     * @api {PATCH} url 修改密码
     * @apiGroup User
     * @apiPermission logged user
     * @apiVersion 2.1.0
     * @apiDescription 修改密码
     * @apiParam {String} targetUId PATH参数目标用户id
     * @apiParam {String} userAccessToken QUERY参数,用户访问凭证
     * @apiParam {String} uId QUERY参数,用户ID
     * @apiParam {String} oldpwd QUERY参数用户旧密码
     * @apiParam {String} password BODY参数用户新密码
     * @apiParamExample {json} 请求BODY参数
     * @apiSuccessExample {json} 返回样例:
     * <p>
     * {
     * "meta": {
     * "errCode": 0,
     * "errMsg": "",
     * "detail": "",
     * "requestUrl": ""
     * },
     * "data": {}
     * }
 * </p>
     */
    //1.修改密码模块
    @RequestMapping(value = "/{targetuId}/password", method = RequestMethod.PATCH)
    public ResponseEntity<ResponseContent> modifyPassword(@PathVariable String targetUId,
                                                          @RequestParam String userAccessToken, @RequestParam String uId, @RequestParam String oldpwd, @RequestBody String body) throws Exception {
        //验证用户accessToken
        //tokenManager.checkAccessToken(uId,userAccessToken);
        String password = (String) JSON.parseObject(body).get("password");

        //判断各@RequestParam里的参数值是否为空
        if (!StringUtils.hasText(targetuId) || !StringUtils.hasText(userAccessToken) || !StringUtils.hasText(uId) || !StringUtils.hasText(oldpwd) || !StringUtils.hasText(password)) {
            throw new ValidateFailureException("参数错误");
        }
        String errorMessage = userService.modifyPassword(oldpwd, password, targetuId);
        if (errorMessage == null) {
            ResponseContent content = ResponseUtil.okContent(null);
            return ResponseEntity.ok(content);
        } else {
            throw new Exception(errorMessage);
        }

    }
}

发现如下问题:
首先,当参数不规范的时候,它抛出了ValidateFailureException();难道参数错误就直接抛出异常,让进程终止?还是spring底层会帮我们处理这些异常,让程序正常运行。
然后,参数错误我想的是创建一个DTO,给页面回显一些提示,可是为什么这里要抛异常呢?求解释啊大神。
最后,ResponseContent的代码如下:
package com.shaxun.api.response;

public class ResponseContent {
private Object data;
private Meta meta;

public void setMeta(Meta meta) {
this.meta = meta;
}

public Meta getMeta() {
return this.meta;
}

public void setData(Object data) {
this.data = data;
}

public Object getData() {
return this.data;
}

}

还有ResponseUtils的代码:
public class ResponseUtil {
public static ResponseContent okContent(Object data) {
Meta meta = new Meta();
meta.setErrcode(ErrorCode.OK.intValue());
meta.setDetail("OK");

ResponseContent rsp = new ResponseContent();
rsp.setMeta(meta);
rsp.setData(data);

return rsp;
}
}

8 个解决方案

#1


你也可以不抛出异常啊,把异常捕获,然后输出另外一个 ResponseContent  Meta之类的,页面就可以处理了。

#2


@IUPRG
多谢二楼,已经明了

#3


你们是有封装catch异常的?  没有的话,可以直接返回一个 Response信息,提示前段什么异常或者错误就行了

#4


引用 2 楼 zjq852533445 的回复:
@IUPRG
多谢二楼,已经明了
SpringMVC的Controller层方法为什么要抛异常二楼不是你自己吗

#5


引用 4 楼 yuxiangaaaaa 的回复:
Quote: 引用 2 楼 zjq852533445 的回复:

@IUPRG
多谢二楼,已经明了
SpringMVC的Controller层方法为什么要抛异常二楼不是你自己吗

你是不会数数呀,哥们

#6


引用 5 楼 juanmiao 的回复:
Quote: 引用 4 楼 yuxiangaaaaa 的回复:

Quote: 引用 2 楼 zjq852533445 的回复:

@IUPRG
多谢二楼,已经明了
SpringMVC的Controller层方法为什么要抛异常二楼不是你自己吗

你是不会数数呀,哥们


小学没毕业。。请问您是几楼?

#7


引用 6 楼 yuxiangaaaaa 的回复:
Quote: 引用 5 楼 juanmiao 的回复:

Quote: 引用 4 楼 yuxiangaaaaa 的回复:

Quote: 引用 2 楼 zjq852533445 的回复:

@IUPRG
多谢二楼,已经明了
SpringMVC的Controller层方法为什么要抛异常二楼不是你自己吗

你是不会数数呀,哥们


小学没毕业。。请问您是几楼?

哈哈哈哈,别欺负小白。

#8


异常时可以处理的 可以捕获也可以抛出 

#1


你也可以不抛出异常啊,把异常捕获,然后输出另外一个 ResponseContent  Meta之类的,页面就可以处理了。

#2


@IUPRG
多谢二楼,已经明了

#3


你们是有封装catch异常的?  没有的话,可以直接返回一个 Response信息,提示前段什么异常或者错误就行了

#4


引用 2 楼 zjq852533445 的回复:
@IUPRG
多谢二楼,已经明了
SpringMVC的Controller层方法为什么要抛异常二楼不是你自己吗

#5


引用 4 楼 yuxiangaaaaa 的回复:
Quote: 引用 2 楼 zjq852533445 的回复:

@IUPRG
多谢二楼,已经明了
SpringMVC的Controller层方法为什么要抛异常二楼不是你自己吗

你是不会数数呀,哥们

#6


引用 5 楼 juanmiao 的回复:
Quote: 引用 4 楼 yuxiangaaaaa 的回复:

Quote: 引用 2 楼 zjq852533445 的回复:

@IUPRG
多谢二楼,已经明了
SpringMVC的Controller层方法为什么要抛异常二楼不是你自己吗

你是不会数数呀,哥们


小学没毕业。。请问您是几楼?

#7


引用 6 楼 yuxiangaaaaa 的回复:
Quote: 引用 5 楼 juanmiao 的回复:

Quote: 引用 4 楼 yuxiangaaaaa 的回复:

Quote: 引用 2 楼 zjq852533445 的回复:

@IUPRG
多谢二楼,已经明了
SpringMVC的Controller层方法为什么要抛异常二楼不是你自己吗

你是不会数数呀,哥们


小学没毕业。。请问您是几楼?

哈哈哈哈,别欺负小白。

#8


异常时可以处理的 可以捕获也可以抛出