MST
星途 面试题库

面试题:Java自定义异常与设计模式结合

假设你正在开发一个大型的企业级Java应用,需要自定义一系列异常来处理业务逻辑中的特殊情况。请结合一种合适的设计模式(如策略模式、责任链模式等),说明如何优雅地组织和处理这些自定义异常,以提高代码的可维护性和扩展性,给出详细的设计思路和关键代码片段。
18.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

采用责任链模式来组织和处理自定义异常。责任链模式允许你将请求沿着处理者链进行发送。每个处理者都有机会处理请求,或者将请求传递给链中的下一个处理者。在处理自定义异常的场景下,每个处理者可以负责处理特定类型的异常,这样可以使异常处理逻辑更加清晰和可维护。

关键代码片段

  1. 定义异常类
// 自定义异常基类
class BusinessException extends Exception {
    public BusinessException(String message) {
        super(message);
    }
}

// 具体的自定义异常类
class UserNotFoundException extends BusinessException {
    public UserNotFoundException(String message) {
        super(message);
    }
}

class PermissionDeniedException extends BusinessException {
    public PermissionDeniedException(String message) {
        super(message);
    }
}
  1. 定义异常处理接口
interface ExceptionHandler {
    void handle(BusinessException exception);
    void setNext(ExceptionHandler next);
}
  1. 实现具体的异常处理类
class UserNotFoundExceptionHandler implements ExceptionHandler {
    private ExceptionHandler next;
    @Override
    public void handle(BusinessException exception) {
        if (exception instanceof UserNotFoundException) {
            System.out.println("处理 UserNotFoundException: " + exception.getMessage());
        } else if (next != null) {
            next.handle(exception);
        }
    }
    @Override
    public void setNext(ExceptionHandler next) {
        this.next = next;
    }
}

class PermissionDeniedExceptionHandler implements ExceptionHandler {
    private ExceptionHandler next;
    @Override
    public void handle(BusinessException exception) {
        if (exception instanceof PermissionDeniedException) {
            System.out.println("处理 PermissionDeniedException: " + exception.getMessage());
        } else if (next != null) {
            next.handle(exception);
        }
    }
    @Override
    public void setNext(ExceptionHandler next) {
        this.next = next;
    }
}
  1. 构建责任链并处理异常
public class Main {
    public static void main(String[] args) {
        ExceptionHandler userHandler = new UserNotFoundExceptionHandler();
        ExceptionHandler permissionHandler = new PermissionDeniedExceptionHandler();

        userHandler.setNext(permissionHandler);

        try {
            throw new PermissionDeniedException("没有权限访问该资源");
        } catch (BusinessException e) {
            userHandler.handle(e);
        }
    }
}

通过上述代码,我们利用责任链模式,将不同类型的自定义异常分发给对应的处理者进行处理,提高了代码的可维护性和扩展性。如果有新的自定义异常类型,只需新增对应的异常处理类并加入责任链即可。