📜  通用异常处理程序 (1)

📅  最后修改于: 2023-12-03 15:41:58.296000             🧑  作者: Mango

通用异常处理程序

在开发过程中,避免不了会出现各种异常情况,这些异常在未处理的情况下,程序将会停止运行或者出现异常崩溃。因此,通用异常处理程序成为了很重要的一部分,在应对异常情况时,可以有效地减少用户的体验和程序界面的崩溃。

异常类型

异常按照功能分为三类:

  1. 受检异常:需要捕捉或者显式地指明可能产生异常的方法,编译器在编译期发现异常后需要程序强制解决。
  2. 非受检异常:运行时的异常,如 NullPointerExceptionIndexOutOfBoundsException 等。可以使用 catch Exception 来处理。
  3. 错误:是无法处理的异常,如 OutOfMemoryErrorStackOverflowError。一般不建议手动处理这种类型的异常。

我们需要针对这三类异常写出不同的处理方法。

处理方法
受检异常

在方法中使用 throws 关键字可以将异常抛给上层调用者进行处理,目的是让调用者更明确的知道该方法可能会发生什么异常情况,并进行相应的处理。如下:

public void read(String file) throws FileNotFoundException {
    FileInputStream fis = new FileInputStream(file);
    // ...
}

上述代码中,在 read 方法的调用栈中,会抛出 FileNotFoundException 异常,因此必须对其进行捕捉处理。在这种情况下,我们可以在调用方法处使用 try catch 块来捕捉该异常,进行相应的处理,如下:

try {
    read("config.ini");
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
非受检异常

非受检异常通常是由程序逻辑上的问题引起的,如数组越界、空指针异常等。为了捕捉这种异常,我们需要使用 try catch 块将可能出现异常的代码封装起来。如下:

try {
    System.out.println(array[10]);
} catch (ArithmeticException e) {
    e.printStackTrace();
}

上述代码中,如果 array 数组越界,则会引发 ArrayIndexOutOfBoundsException 异常。我们可以捕捉并打印异常信息。但是,由于非受检异常往往会导致程序中止运行,因此在捕捉这种异常时,需要谨慎,并且尽可能收集异常信息以便更好的填坑。

错误

错误是无法处理的异常,建议不要进行处理,因为错误已经超出了程序的处理能力,可能会导致程序崩溃。因此,在不得已的情况下,才考虑对错误进行处理。通常情况下,我们尽可能去避免错误的发生。

统一异常处理

如果每个异常都写一个 try catch,代码看起来会变得混乱并且很难维护,因此通常采用统一异常处理的方式。代码如下:

public static void main(String[] args) {
    try {
        // 执行代码块
    } catch (Exception e) {
        // 捕捉所有异常
        e.printStackTrace();
    } finally {
        // 在异常发生后(或者没有发生),都会执行的代码块
    }
}

上述代码中,try 块是需要被处理的代码块,捕捉所有异常的 catch 块和 finally 块是在发生异常后需要执行的代码块。这样的统一处理方式也更容易让程序员清晰地知道程序的异常情况。

总结

在编写程序时,异常处理是至关重要的一部分。需要对受检异常、非受检异常、错误进行分类处理,并且使用统一的异常处理方式来提高代码的可读性和可维护性。针对不同情况采取不同的处理方式,可以在保障程序正常运行的同时,更好地保护用户体验和程序界面的顺畅。