默认情况下,Springboot提供了一个对/error 映射,它以合理的方式处理所有错误,并在servlet容器中注册为全局错误页。对于客户机端,它生成一个JSON响应,其中包含错误、HTTP状态和异常消息的详细信息。对于浏览器客户端,有一个以HTML格式呈现相同数据的“WhiteLabel”错误视图(若要自定义该视图,请添加一个解析为错误的视图)。要完全替换默认行为,可以实现ErrorController 并注册该类型为bean,或者添加一个类型为ErrorAttributes的bean以使用现有机制,但替换内容。
如下:

@RestController
public class ExceptionController implements ErrorController {

    @Autowired
    private ErrorAttributes errorAttributes;

    /**
     * 默认错误
     */
    private static final String path_default = "/error";

    @Override
    public String getErrorPath() {
        return path_default;
    }

    /**
     * JSON格式错误信息
     */
    @RequestMapping(value = path_default,  produces = {MediaType.APPLICATION_JSON_VALUE})
    public ResponseMessage error(HttpServletRequest request) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        Map<String, Object> body = this.errorAttributes.getErrorAttributes(requestAttributes, true);
        return ResponseMessage.fail("服务器端异常!", body);
    }

}

ResponseMessage 为自定义的实体类,用于向前端返回统一格式信息,结构如:

public class ResponseMessage {

    /**
     * 是否成功
     */
    private boolean success;

    /**
     * 返回文字
     */
    private String msg;

    /**
     * 返回数据
     */
    private Object data;

    public ResponseMessage() {
    }

    public ResponseMessage(boolean success, String msg, Object data) {
        this.success = success;
        this.msg = msg;
        this.data = data;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public static ResponseMessage success(){
        return new ResponseMessage(true, null, null);
    }

    /**
     * 成功返回方法
     * @param data 返回数据
     */
    public static ResponseMessage success(Object data){
        return new ResponseMessage(true, null, data);
    }

    /**
     * 失败返回方法--默认
     */
    public static ResponseMessage fail(){
        return new ResponseMessage(false, null, null);
    }

    /**
     * 失败返回方法
     * @param message 文字信息
     */
    public static ResponseMessage fail(String message){
        return new ResponseMessage(false, message, null);
    }

    /**
     * 失败返回方法
     * @param message 文字信息
     * @param data 数据
     */
    public static ResponseMessage fail(String message, Object data){
        return new ResponseMessage(false, message, data);
    }

}

(来自https://www.jianshu.com/p/23edca918ce8 风吟空城)

BasicErrorController可以用作自定义ErrorController的基类。如果要为新的内容类型添加处理程序(默认情况下是专门处理text/html,并为其他所有内容提供回退),这尤其有用。为此,请扩展BasicErrorController,添加一个带有@RequestMapping 且具有products属性的公共方法,并创建一个新类型的bean。
您还可以定义一个用@ControllerAdvice注释的类,以自定义JSON文档以返回特定的控制器和/或异常类型,如下例所示:

@ControllerAdvice(basePackageClasses = AcmeController.class)
public class AcmeControllerAdvice extends ResponseEntityExceptionHandler {

    @ExceptionHandler(YourException.class)
    @ResponseBody
    ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {
        HttpStatus status = getStatus(request);
        return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == null) {
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }
        return HttpStatus.valueOf(statusCode);
    }

}

在前面的示例中,如果您的异常是由与AcmeController在同一个包中定义的控制器引发的,那么将使用CustomErrorType POJO的JSON表示,而不是使用ErrorAttributes表示。

自定义错误页
如果要显示给定状态代码的自定义HTML错误页,可以将文件添加到 /error文件夹。错误页可以是静态HTML(也就是说,添加到任何静态资源文件夹下),也可以使用模板生成。文件名应该是准确的状态代码或序列掩码。

例如,要将 404 映射到静态HTML文件,文件夹结构如下:

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>

要使用FreeMarker模板映射所有5xx错误,文件夹结构如下:

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- templates/
             +- error/
             |   +- 5xx.ftl
             +- <other templates>

对于更复杂的映射,还可以添加实现ErrorViewResolver接口的bean,如下例所示:

public class MyErrorViewResolver implements ErrorViewResolver {

    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request,
            HttpStatus status, Map<String, Object> model) {
        // Use the request or status to optionally return a ModelAndView
        return ...
    }

}

您还可以使用常规的SpringMVC功能,如@ExceptionHandler 方法和@ControllerAdvice。然后,ErrorController接收任何未处理的异常。