试题

1、 SpringBoot异常的设计的原理

Spring Boot中,支持RestControllerAdvice统一处理异常,在一个请求响应周期当中,如果Controller,Service,Repository出现任何异常,都会被RestControllerAdvice机制所捕获进行统一处理。进行统一异常处理的目的也就是为了将千奇百怪的异常信息转换成用户可识别的错误信息

统一异常拦截器

@RestControllerAdvice

@Slf4jpublic class GlobalExceptionTranslator { }

系统中的两类异常处理

第一类:业务自定义的异常,遇到这种异常,拦截器记录后,将业务异常自己的信息抛出。

@ExceptionHandler(BusinessException.class)

public JSONObject handleError(BusinessException e) {

    log.error("Business Exception {}", getStackTraceAsString(e));

    return error(e);

}

第二类:未定义异常,拦截器负责统一屏蔽原来的异常信息,转为服务器内部异常抛出。

@ExceptionHandler(Throwable.class)

public JSONObject handleError(Throwable undefined) {

    log.error("Internal Server Error {}", getStackTraceAsString(undefined));

    return error(new BusinessException(FAILURE));

}

调用者收到error的结果后,直接显示msg内容为用户可见的错误信息即可。

如何自定义一个业务异常

在业务开发中,通常无需进行Try catch处理,有业务异常直接抛出即可。如果需要定义一类通用的异常,则需要在自己业务模块下新建异常类,继承于 BusinessException

public class PaymentException extends BusinessException {

    //重写构造函数,从而定义该自定义异常的用户可见的错误信息

    public PaymentException() {

        super("支付失败");

    }

}

如何自定义一个框架级异常

在系统框架层面,已经预定义了一些常见的异常类,如:

类名

定义

预置错误信息

PermissionDenyException

用户访问未授权的内容

权限不足

ServiceNotFoundException

调用微服务失败

调用相关服务失败

其他异常

在定义框架级异常时,除了需要编写异常类之外,如需要前端根据error CODE做对应的处理,就可以在ResultCode中增加定义。示例如下:

@Getter

@AllArgsConstructor

public enum ResultCode {

    /**

    * 操作成功

    */

    SUCCESS(HTTP_OK, "操作成功"),

    /**

    * 因程序内部错误操作失败(如不指定,则默认这个异常)

    */

    FAILURE(HTTP_INTERNAL_ERROR, "系统运行异常,请联系管理员"),

    /**

    * 用户访问未授权的内容

    */

    UN_AUTHORIZED(HTTP_UNAUTHORIZED, "权限不足"),

    /**

    * 调用微服务失败

    */

    NOT_FOUND(HTTP_NOT_FOUND, "调用相关服务失败");

    final int code;

    final String msg;

}

一个框架级异常的实现类

public class PermissionDenyException extends BusinessException {

    public PermissionDenyException() {

        super(UN_AUTHORIZED);

    }

}

如需要框架对该异常定义统一的策略,则需要在GlobalExceptionTranslator实现该策略,示例如下:

public class GlobalExceptionTranslator { 

    @ExceptionHandler(NewGlobalException.class)

    public JSONObject handleError(NewGlobalException e) {

        // 这里可以实现自定义的异常策略

        return error(new BusinessException(e.getResultCode(),e.getMessage()));

    }

}

2、 前后端分离开发,日志应该如何进行记录,在出现问题的时候,方便定位问题?

    使用logBack来进行日志记录,并把日志级别由info调制debug

3、 跨域的含义

    跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。所谓同源是指,域名,协议,端口均相同,有一个不同即为跨域。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,696评论 1 114
  • 1 以下属于面向对象的特征的是() 答:面向对象的特征主要是:封装、继承、多态。而多态的实现主要是函数方法的重载和...
    apollooo阅读 6,463评论 1 2
  • 1.下列哪些语句关于内存回收的说明是正确的? (b )A、 程序员必须创建一个线程来释放内存B、内存回收程序负责释...
    悠悠我心_4a00阅读 580评论 0 2
  • 目录本次给大家介绍的是我收集以及自己个人保存一些.NET面试题第二篇简介1.接口2.您在什么情况下会用到虚方法或抽...
    寒剑飘零阅读 1,997评论 0 10
  • 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象是将一类对象的共同特征总结出...
    yshenhn阅读 1,203评论 0 8