账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    java在service层需要每个方法上都加上抛出异常吗?
    • 2020-01-01 00:00
    • 10
    75
    0

    默认spring事务抛出异常回滚只会是runtimeException,有些异常没法直接回滚,需要自己定义回滚的异常类,需要在方法的异常注释里写回滚的异常类型,同时如果方法里没加上throws Exception的话非runtimeException也不会回滚,不知道大家公司里代码规范会不会强制要求方法都加上异常的处理?我看了下阿里的代码规范并没有这部分的规定,但是我感觉如果不加异常控制的话碰到非runtimeException可能就没法回滚了。

    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 洅回首ㄨ恍然如梦 普通会员 1楼

      在Java中,无论在服务层还是其他任何层,添加抛出异常通常是避免程序出现异常错误的一种常见方式。虽然在服务层方法中可能需要添加异常处理代码,但并不是所有的方法都需要这样做。

      以下是一些情况下,是否在服务层每个方法上都添加异常处理的例子:

      1. 网络请求异常:如果服务层需要处理网络请求,如通过HTTP或HTTPS发送请求,那么每个方法都应添加异常处理代码。这样,如果在请求过程中出现网络错误,例如HTTP状态码500(Internal Server Error)或404(Not Found),请求可以被捕获并抛出一个适当的异常。这将帮助接收者知道具体发生了什么错误,并采取适当的措施来修复或处理它。

      ```java import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;

      @RestController public class ServiceController {

      @PostMapping("/api/v1/data")
      public ResponseEntity fetchData(@RequestParam String url) {
          try {
              // 发送网络请求
              ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
              // 处理响应
              String data = response.getBody();
              return ResponseEntity.ok(data);
          } catch (Exception e) {
              // 处理网络请求异常
              throw new RuntimeException("Failed to fetch data from " + url, e);
          }
      }
      

      } ```

      1. 业务逻辑错误:在服务层处理业务逻辑错误时,例如处理用户请求的错误、错误处理或错误传递,可能会在某些方法中添加异常处理代码。这些方法可能包括一些简单的异常处理代码,如检查请求参数是否为空、检查用户是否授权访问特定资源等。如果在处理业务逻辑错误时出现异常,这些方法可以捕获并处理这些异常,例如使用try-catch块或异常处理函数。

      ```java import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;

      @RestController public class ServiceController {

      @PostMapping("/api/v1/data")
      public ResponseEntity fetchData(@RequestParam String url, @RequestParam String userId) {
          try {
              // 检查用户是否授权访问特定资源
              if (!isUserAuthorized(userId)) {
                  throw new RuntimeException("User not authorized to access " + url);
              }
              // 发送网络请求
              ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
              // 处理响应
              String data = response.getBody();
              return ResponseEntity.ok(data);
          } catch (Exception e) {
              // 处理网络请求异常
              throw new RuntimeException("Failed to fetch data from " + url, e);
          }
      }
      
      private boolean isUserAuthorized(String userId) {
          // 访问权限检查逻辑
          // ...
          return true; // 或者返回false表示用户没有权限
      }
      

      } ```

      在上述示例中,我们使用了@RequestParam注解来处理请求参数,@RequestBody注解来处理请求体。我们还使用了@PostMapping注解来创建一个HTTP请求,@GetMapping@PostMapping注解可以用于处理HTTP方法(如GET、POST、PUT、DELETE等)。在上述示例中,isUserAuthorized方法用于检查用户是否授权访问特定资源,如果拒绝访问,抛出一个异常。

      在实际应用中,应根据业务需求和使用的HTTP方法选择适当的异常处理策略。如果服务层代码复杂且包含大量的业务逻辑错误,可能需要在每个方法中添加异常处理代码。如果业务逻辑相对简单且使用HTTP请求处理,可能只需要在处理网络请求的特定方法中添加异常处理代码。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部