首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >:异常处理

:异常处理
EN

Stack Overflow用户
提问于 2022-11-21 18:51:51
回答 1查看 41关注 0票数 2

对webservices的Java风格有一点新的认识--所以请温柔一点。为什么大多数Spring示例都没有显示被捕获的异常呢?--我看到我的一些开发人员经常这样做。答案是:这是一个普遍的惯例。但是为什么呢。我是否遗漏了使用Spring创建的web服务的一个关键概念?

,例如

代码语言:javascript
复制
@PostMapping(path = "/sampleEndpoint/v1/myEndpoint", produces = "application/json")
public ResponseEntity<String> myEndpoint(@RequestBody MyEndpointRequest myEndpointRequest) {
    
     MyEndpointResponse response = someService.myEndpoint(myEndpointRequest);
     return new ResponseEntity<>(response, HttpStatus.OK);
}

我认为,对于体系结构,您至少应该添加一个带一些日志的try/catch块,并抛出一个带有异常消息的新异常:

代码语言:javascript
复制
@PostMapping(path = "/sampleEndpoint/v1/myEndpoint", produces = "application/json")
public ResponseEntity<String> myEndpoint(@RequestBody MyEndpointRequest myEndpointRequest) {


  try{  
       MyEndpointResponse response = someService.myEndpoint(myEndpointRequest);
       return new ResponseEntity<>(response, HttpStatus.OK);

  }catch(Exception ex){
    //Your favorite logger:
    log.error("STACK_TRACE: {}", StaticClass.stackTraceToString(ex));

    //throw exception for calling or consuming system/application:
    throw new MiscException(ex.getMessage());
  }
}

有几件事可以说明这个问题的背景(观察):

  • 使用多个数据源:两个数据库和一些其他web服务(为我们的客户端提供一个一站式的地方来获取他们的数据。使用该web服务的
  • 与潜在的4种不同的客户端/presentation层类型的/presentation团队希望捕获来自我们点击into...and日志的数据源的意外异常。

)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-21 23:01:27

那么,应该由开发人员来实现捕获异常机制。但是,定义异常类型和错误代码/消息是一个很好的实践。假设您有一个用id获取产品的端点,但是没有该id的产品,在这种情况下,客户端将接收带有http 500消息的internal server error代码。这将使用户和开发人员感到困惑,导致错误的真正原因是什么。

因此,防止出现这种情况,您可以从@ControllerAdvice注释获得帮助,它将允许将异常处理程序应用到多个或所有控制器。首先,您将定义您的自定义异常,如:

代码语言:javascript
复制
public class ProductNotFoundException extends RuntimeException {

    public ProductNotFoundException(Long id) {

        super(String.format("Product with id %d not found", id));
    }
}

然后可以定义您的ControllerAdvice类:

代码语言:javascript
复制
@ControllerAdvice
public class ExceptionHandler extends ResponseEntityExceptionHandler {

 @ExceptionHandler(ProductNotFound.class)
    public ResponseEntity<Object> handleProductNotFoundException(
        ProductNotFoundException ex, WebRequest request) {

        Map<String, Object> body = new LinkedHashMap<>();
        body.put("timestamp", LocalDateTime.now());
        body.put("message", "Product not found");

        return new ResponseEntity<>(body, HttpStatus.NOT_FOUND);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74523623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档