java编程之Exception handlers should preserve the original exception

捕捉到异常后, 原始异常的信息以及栈追溯信息应该被log下来或者向上传递,下面是一些关于java异常处理可能会出现问题的地方,希望对大家有所帮助!

不兼容代码例子

 // Noncompliant - exception is lost
try { /* ... */ } catch (Exception e) { LOGGER.info("context"); }   

// Noncompliant - exception is lost (only message is preserved)       
try { /* ... */ } catch (Exception e) { LOGGER.info(e.getMessage()); }   

// Noncompliant - exception is lost 
try { /* ... */ } catch (Exception e) { throw new RuntimeException("context"); }

兼容代码例子

try { /* ... */ } catch (Exception e) { LOGGER.info(e); }   

try { /* ... */ } catch (Exception e) { throw new RuntimeException(e); }

try {
  /* ... */
} catch (RuntimeException e) {
  doSomething();
  throw e;
} catch (Exception e) {
  // Conversion into unchecked exception is also allowed
  throw new RuntimeException(e);
 }

e.getMessage获得的异常信息远不如直接通过logger.log(Level.SEVERE,"",异常对象)这个方式记录的信息全,强烈建议采用后者
来记录异常信息。
 
是的,在 Ocelot 中有名为 `ExceptionHandlers` 的特性,它可以用于处理异常。 `ExceptionHandlers` 特性允许我们为每个路由或者全局配置一个或多个异常处理程序。当路由或全局发生异常时,Ocelot 将会按照注册的异常处理程序列表顺序,依次调用这些异常处理程序进行处理。如果有任何一个异常处理程序能够成功处理异常并返回响应,则 Ocelot 将不会继续调用后续的异常处理程序。 下面是一个使用 `ExceptionHandlers` 特性来处理异常的示例: ```csharp [Route("api/products")] [ExceptionHandlers(typeof(ProductExceptionHandler))] public class ProductsController : Controller { [HttpGet("{id}")] [ExceptionHandler(typeof(ProductNotFoundException))] public async Task<IActionResult> GetProduct(int id) { var product = await _productService.GetProductById(id); if (product == null) { throw new ProductNotFoundException(id); } return Ok(product); } } public class ProductExceptionHandler : IExceptionHandler { public Task<Response> HandleAsync(Exception exception) { if (exception is ProductNotFoundException) { var ex = (ProductNotFoundException) exception; var error = new ErrorResponse { Code = "404", Message = $"Product with id '{ex.ProductId}' not found." }; return Task.FromResult(new ErrorResponse { StatusCode = HttpStatusCode.NotFound, Message = JsonConvert.SerializeObject(error) }); } return Task.FromResult<Response>(null); } } public class ProductNotFoundException : Exception { public int ProductId { get; } public ProductNotFoundException(int productId) { ProductId = productId; } } ``` 在上面的代码中,我们使用 `ExceptionHandlers` 特性分别为 `ProductsController` 和 `GetProduct` 方法注册了异常处理程序。当在 `GetProduct` 方法中抛出 `ProductNotFoundException` 异常时,Ocelot 将会调用 `ProductExceptionHandler` 处理该异常并返回响应。如果 `ProductExceptionHandler` 不能处理该异常,则 Ocelot 将会调用后续的异常处理程序。 需要注意的是,`ExceptionHandlers` 特性可以应用于控制器、动作或全局配置。如果应用于控制器或动作,则只对当前控制器或动作有效;如果应用于全局配置,则对整个应用程序都有效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值