文
章
目
录
章
目
录
我们一直在代码中为几乎每个行业标准应用程序使用处理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 自定义异常的文章能为您提供一些信息。如果您有一些建议,请写留言评论。