关于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 -> 订单服务 -> 商品服务

经过测试发现,如果在 订单服务 中抛出异常,是可以处理并返回封装结果的:

image_1cn3u24mh364blq1sre4c1hp059.png-57.8kB

但是如果在 商品服务 中抛出异常的话:

image_1cn3u8qc61odqi3i12ol1mr2diu5m.png-78.6kB

这是个什么意思呢?
也就是说, Zuul -> A -> B, 如果异常是在 A 这里抛出来的,是没问题的,但如果异常是在 B 这里抛出,那么在 A 这里就要挂了。

对了,我在您的 5-7 扣库存 这一课中,看到您也是在 商品服务 中做了库存的判断,如果库存不足,则抛出异常。

求师兄指教,该如何操作。

写回答

2回答

廖师兄

2018-09-12

A是通过http调用B的,http有header和body,是不能传递异常的。B抛出异常,对外就是http的status=500

0
4
Yoooshiki
谢谢师兄
2018-09-12
共4条回复

Yoooshiki

提问者

2018-09-11

慕课网的这个 markdown 也太丑了, 发布问题预览的时候挺好,谁知道发出来这么难看,图都挂了。

好吧,再上传一次图。

经过测试发现,如果在 订单服务 中抛出异常,是可以处理并返回封装结果的:

//img.mukewang.com/szimg/5b978f330001424808900570.jpg


但是如果在 商品服务 中抛出异常的话:

//img.mukewang.com/szimg/5b978f460001a6a108880625.jpg

0
0

SpringCloud Finchley(M2+RELEASE+SR2)微服务实战

SpringCloud组件实现微服务,【已升级Finchley.Release】

5668 学习 · 2489 问题

查看课程