上文主要说明了异常的产生、异常的捕获、异常处理流程。程序中的异常是不可以避免的,那么应该怎么去处理异常尤为重要了。
处理异常的方式
1、只进行捕获,不做任何处理
当异常发生时,上述代码对异常进行了捕获,捕获发生后进入catch子句,catch子句里面没有任何代码,实际上异常并没有得到处理,因此catch子句执行完成后,catch区段之后的代码将“好像没有发生过什么似的”继续执行。换句话说,方式1没有对异常做任何应对,只是将它给(吞)了。这样的做法很危险,因为后续程序可能就会遭遇失败,由于缺少对上述异常的必要处理与记录,直接导致我们定位错误非常困难。
2、捕获异常,简单的打印
e.printStackTrace()进行异常情况输出,在调试可能会有一定的帮助,但是调试阶段结束后,就不利于程序的维护。更加安全有理的方式是,在屏幕上输出了异常发生的位置与导致异常的原因,同时还将异常详细信息输出到了一个日志文件。
public class ExceptionDemo { public static void throwsTest(){ try { Class.forName("java.util.List"); } catch (ClassNotFoundException e) {//异常处理 System.out.println("Class.forName() 类加载异常:" + e.getMessage()); logFile(nfe); } } public static void main(String[] args) { throwsTest(); } }
2、throws 异常
throws 在方法的声明处使用,表示此方法不处理异常,所有的异常交给被调用处进行处理,而调用处也可继续向上递交异常。
public class ExceptionDemo { public static void throwsTest() throws ClassNotFoundException{ Class.forName("java.util.List"); } public static void main(String[] args) throws ClassNotFoundException { throwsTest(); } }
此处都没有对异常进行处理,最终有 JVM 都异常处理,进行后台的异常输出。
3、throw 异常
throw 主要用于方法体之中,表示人为的抛出一个异常类的实例化对象,常用来抛出自定义的异常,与 throws 配合使用将异常交由调用者处理。
备注:自定义异常的方式
在正常使用的情况下,很少会定义自己的异常类,但是如果在学习框架,或者是你日后设计框架的时候都有可能定义许多属于此框架的异常类。
上述的异常,最终的处理形式还是回到了方式2的处理规则上。进行错误信息简单输出,完整信息写入日志文件。
小结:
不要推诿或延迟处理异常,尽量就地解决他们,就地解决最好,并且需要实实在在的进行处理,而不是只捕捉,不动作。
原文地址:https://www.cnblogs.com/SacredOdysseyHD/p/8411269.html