前言
使用Springboot时,使用feign客户端作为http请求工具时,当接口抛出异常信息时,使用全局异常是捕获不了异常的
feign异常全局捕获
定义一个异常类
scala
@Getter
public class BusinessException extends RuntimeException {
private String message;
private int code;
public BusinessException(String message, int code) {
this.message = message;
this.code = code;
}
public BusinessException(String message) {
super(message);
this.message = message;
}
}
捕获feign请求异常
vbnet
@Slf4j
@Configuration
public class FeignExceptionConfig {
@Bean
public ErrorDecoder feignError() {
return (key, response) -> {
if (response.status() != HttpStatus.OK.value()) {
try {
String data = IOUtils.toString(response.body().asInputStream());
log.error("feign请求错误,返回值为:{{}}", data);
throw new BusinessException(data);
} catch (BusinessException e) {
throw e;
} catch (Exception e) {
log.error("异常信息为:", e);
throw new RuntimeException(e);
}
}
// 其他异常交给Default去解码处理
// 这里使用单例即可,Default不用每次都去new
return new ErrorDecoder.Default().decode(key, response);
};
}
}
或者在全局异常捕获加上这个
less
@ExceptionHandler(FeignException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleFeignException(FeignException ex) {
log.error("feign异常处理信息", ex);
return ex.contentUTF8();
}
总结
feign客户端是一个强大的请求工具,但是异常处理有时候得额外处理