Java 中创建自定义异常

培训教学 潘老师 8个月前 (09-17) 161 ℃ (0) 扫码查看

我们一直在代码中为几乎每个行业标准应用程序使用处理Java 自定义异常。通常的方法是创建一些自定义异常类,扩展基本异常处理最佳实践,这可能更有意义。

1. 传统方法

假设我们正在创建一个自定义异常DBException来表示数据库相关操作期间发生的异常。传统上,我们DBException通过扩展Exception类来创建类。

public class DBException extends Exception {

  public DBException() {
    super();
  }

  public DBException(String message) {
    super(message);
  }

  public DBException(String message, Throwable cause) {
    super(message, cause);
  }
}

现在,每当我们遇到需要抛出与数据库相关的异常的情况时,我们通常会创建一个实例,以消息的形式DBException放入一些信息并抛出它。

现在,让我们考虑一下我们已经确定的以下情况,我们需要抛出DBException

  • SQL执行错误
  • 我们期望至少一行的地方不存在数据
  • 在我们期望只有单行的地方存在多行
  • 无效参数错误
  • 以及更多这样的案例

上述方法的问题在于,在catch块或应处理这些异常的应用程序代码中,DBException没有提供足够的信息来唯一地处理上面列出的每个用例。

2.使用内部类的新方法

我们的新方法对每个新的异常场景使用静态内部类

2.1. 创建新的异常类型

让我们用内部类来解决上述问题,我们将为每个用例创建一个类,然后将它们分组到类中DBException

让我们从 BaseException 类开始,它是作为抽象创建的,并将成为所有异常类的超类。

public abstract class BaseException extends Exception {

  private String message;

  public BaseException(String msg) {
    super(msg);
    this.message = msg;
  }

  public String getMessage() {
    return message;
  }
}

现在是时候创建新的Exception内部类了。

public class DBException {

  //SQL execution error
  public static class BadExecution extends BaseException {

    public BadExecution(String msg) {
      super(msg);
    }
  }

  //No data exist where we expect at least one row
  public static class NoData extends BaseException {

    public NoData(String msg) {
      super(msg);
    }
  }

  //Multiple rows exist where we expect only single row
  public static class MoreData extends BaseException {

    public MoreData(String msg) {
      super(msg);
    }
  }

  //Invalid parameters error
  public static class InvalidParam extends BaseException {

    public InvalidParam(String msg) {
      super(msg);
    }
  }
}

在这里,我们为启动时识别的每个可能的错误场景创建了一个内部类。还可以有更多的附加功能。这仅取决于您来识别和添加更多类。

2.2. 如何使用自定义异常?

现在为了了解它的用处,让我们创建一个异常并抛出它。然后我们就会在日志中看到错误信息。

public class TestExceptions {
    public static void main(String[] args)
    {
        try
        {
            throw new DBExeption.NoData("No row found for id : x");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

程序输出:

com.exception.DBExeption$NoData: No row found for id : x
at com.test.TestExceptions.main(TestExceptions.java:7)

正如您所看到的,异常堆栈跟踪中的日志消息已变得更加丰富。它清楚地告诉了错误是什么。在应用程序代码中,您也可以检查自定义异常的实例并进行相应的处理。

3、优点

  • 最重要的好处是,如果开发人员编写了一些可疑的消息文本,那么他也可以清楚地观察到到底出了什么问题。
  • 您可以在处理不同异常情况的不同情况下使用实例比较。
  • 您不需要针对大量异常情况发送单个异常。
  • 在您知道您应该期望的确切异常类的情况下,为负面情况编写单元测试用例很容易。
  • 日志记录更有意义、信息更丰富。

我希望这篇关于 Java 自定义异常的文章能为您提供一些信息。如果您有一些建议,请写留言评论。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9106.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】