关于SpringCloud的全局异常捕获
来源:5-7 扣库存(Feign)
Yoooshiki
2018-09-11
师兄您好,我已经看完了 Zuul
的使用,但是还是没明白统一异常该如何处理。
我目前遇到的情况是这样的,同样根据 订单服务
、商品服务
来举例,在这两个服务中,都有 ResultVO
,以及当前服务 ExceptionHandler
。
- ResultVO
package com.vito.product.vo
/**
* Created by VitoYi on 2018/9/11.
*/
class ResultVO<T> private constructor(
val code: Int?, //错误码
val msg: String, //提示信息
val data: T?
) {
companion object {
fun <T> success(data: T): ResultVO<T> {
return ResultVO(0, "success", data)
}
fun <T> error(code: Int?, msg: String): ResultVO<T> {
return ResultVO(code, msg, null)
}
}
}
- ExceptionHandler
package com.vito.order.exception
import com.vito.order.vo.ResultVO
import org.slf4j.LoggerFactory
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.ResponseBody
/**
* Created by VitoYi on 2018/9/11.
*/
@ControllerAdvice
class ExceptionHandle {
val log = LoggerFactory.getLogger(this.javaClass)
@ExceptionHandler(value = [(Exception::class)])
@ResponseBody
fun handler(e: Exception): ResultVO<Any> {
return when(e){
is CreateOrderException -> ResultVO.error(e.code, e.message!!)
else -> {
log.error("【系统异常】{}", e)
ResultVO.error(-1, e.message!!)
}
}
}
}
比如当有一个下单的请求进来时,请求路径是这样的:Zuul -> 订单服务 -> 商品服务
经过测试发现,如果在 订单服务
中抛出异常,是可以处理并返回封装结果的:
但是如果在 商品服务
中抛出异常的话:
这是个什么意思呢?
也就是说, Zuul -> A -> B, 如果异常是在 A
这里抛出来的,是没问题的,但如果异常是在 B
这里抛出,那么在 A
这里就要挂了。
对了,我在您的 5-7 扣库存 这一课中,看到您也是在 商品服务
中做了库存的判断,如果库存不足,则抛出异常。
求师兄指教,该如何操作。
写回答
2回答
-
A是通过http调用B的,http有header和body,是不能传递异常的。B抛出异常,对外就是http的status=500
042018-09-12 -
Yoooshiki
提问者
2018-09-11
慕课网的这个 markdown 也太丑了, 发布问题预览的时候挺好,谁知道发出来这么难看,图都挂了。
好吧,再上传一次图。
经过测试发现,如果在 订单服务 中抛出异常,是可以处理并返回封装结果的:
但是如果在 商品服务 中抛出异常的话:
00
SpringCloud Finchley(M2+RELEASE+SR2)微服务实战
SpringCloud组件实现微服务,【已升级Finchley.Release】
5668 学习 · 2489 问题
相似问题