![446f0da10bb112269fe9b808a311981b.gif](https://i-blog.csdnimg.cn/blog_migrate/48a5e2ce2d97b043c36b6739ce897b64.gif)
![b4b9532459e351012218df766bd0d546.png](https://i-blog.csdnimg.cn/blog_migrate/9d96321fcaffafa4d374daba8784adc8.jpeg)
这是一个系列文章,如果你是零基础,建议在 @Python大星 主页翻看往期文章,建议收藏!
一、Python的异常处理机制
1、异常定义
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
2、Python 中的异常处理
python 是一种解释型语言,也就是说没有编译,所有它没有检查时异常,只有运行时异常。
3、Python 异常分类
![928072b7ffc035281794efea50fdbb5e.png](https://i-blog.csdnimg.cn/blog_migrate/232de049b1d513c90aa38ae6821a85c5.jpeg)
4、Python 异常关键字
python 中的异常处理相比java来说,要简单一些
try:捕获异常,类似于 java 中的 try
except:处理异常,类似于 java 中的 catch
finally:不管是否捕获到异常都会被执行,类似于 java 中 的 finally
raise:抛出异常,类似于 java 中的 throw
① try ... except
![6f0615b1787f97335978471ecc2cbb29.png](https://i-blog.csdnimg.cn/blog_migrate/7b8984a5d1d0bafe0a8c3b29b02a18da.jpeg)
在python的异常中,还有一个万能异常:Exception
② try ... except ... finally
![8286d7e08672bb3b2663f2eb9135c2cd.png](https://i-blog.csdnimg.cn/blog_migrate/367399c250dff6776111adc3aff0d4fc.jpeg)
输出结果:
![ee5585a3c09c04082d51eacaba95246d.png](https://i-blog.csdnimg.cn/blog_migrate/68735dca260ebf917e7a0baac35a5b22.jpeg)
③ raise
![b7eb8d1229987f7828ef8c0a4525ddff.png](https://i-blog.csdnimg.cn/blog_migrate/e48844cf60b21344b8e461b305657081.jpeg)
输出结果:
![15c6f122f15c1614f354605d403c9764.png](https://i-blog.csdnimg.cn/blog_migrate/302a198b470833884b6f1345ec2392b3.jpeg)
二、Java的异常处理机制
异常定义
Java 异常是 Java 提供的一种识别及响应错误的一致性机制。
异常架构
![f8f594eb4a2fb22586d3da32d3e7f14e.png](https://i-blog.csdnimg.cn/blog_migrate/a61e05bf3b85ae9a8644a9ee6135fd03.jpeg)
1、 Throwable
Java 语言中所有错误与异常的超类。
Throwable 包含两个子类:Error(错误)和 Exception(异常)。
Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。
2、 Error(错误)
特点:此类错误一般表示代码运行时 JVM 出现问题。
通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。
比如 OutOfMemoryError:内存不足错误;StackOverflowError:栈溢出错误。
此类错误发生时,JVM 将终止线程。
注意: 这些错误是不受检异常,非代码性错误,程序本身不可以处理。
3、 Exception(异常)分类
程序本身可以捕获并且可以处理的异常。
Exception 这种异常又分为两类:编译时异常(除RuntimeException)和运行时异常(RuntimeException)。
① 编译时异常
简单说就是你敲代码时提示的异常。
比如 ClassNotFoundException(没有找到指定的类异常),IOException(IO流异常)。
最常见的就是 IO 流异常。
② 运行时异常(RuntimeException)
NullPointerException 空指针异常
![6306d45fe8e25395083ec03c0f9bb7a4.png](https://i-blog.csdnimg.cn/blog_migrate/37d4fd8bcac3f8131fe77a1579287b5d.jpeg)
ArrayIndexOutBoundException 数组下标越界异常
![497539c14716b8699e8ede054fc06a2a.png](https://i-blog.csdnimg.cn/blog_migrate/0753743e6e54bb637029deaf79d01bd7.jpeg)
ArithmeticExecption 算术异常
![a5e8fd050dabb760ffb0300413dee33e.png](https://i-blog.csdnimg.cn/blog_migrate/683e6ca1f6b3bd5243a3224937db5033.jpeg)
ClassCastException 类型转换异常
这个在涉及到类时再补充。
4、受检异常(checked exception)与非受检异常(unchecked exception)
① 受检异常
编译器要求必须处理的异常,比如 ClassNotFoundException
② 非受检异常
编译器不会进行检查并且不要求必须处理的异常。该类异常包括运行时异常(RuntimeException极其子类)和错误(Error)。
注意:这里包含 Error。比如 NoClassDefFoundError ,引起该异常的原因是 JVM 或 ClassLoader 尝试加载某类时在内存中找不到该类的定义,该动作发生在运行期间,即编译时该类存在,但是在运行时却找不到了,可能是变异后被删除了等原因导致;
5、异常关键字
① try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在 try 语句块之内,当 try 语句块内发生异常时,异常就被抛出。
② catch – 用于捕获异常。catch 用来捕获 try 语句块中发生的异常。
③ finally – finally 语句块总是会被执行。它主要用于回收在 try 块里打开的物理资源(如数据库连接、网络连接和磁盘文件)。只有 finally 块,执行完成之后,才会回来执行 try 或者 catch 块中的 return 或者 throw 语句,如果finally 中使用了 return 或者 throw 等终止方法的语句,则就不会跳回执行,直接停止。
④ throw – 用于抛出异常。
⑤ throws – 用在方法签名中,用于声明该方法可能抛出的异常。
![af9ac1af936d980ab28d9693bf4ecd73.png](https://i-blog.csdnimg.cn/blog_migrate/c2a9acd2beacdb2e8f880a2103742c0f.jpeg)
I、try ... catch 的基本用法
![76b9a3d52ea23c1ba807270304fd3333.png](https://i-blog.csdnimg.cn/blog_migrate/a268a00f8f67da684ed9353bfe6ba8ab.jpeg)
![5d3fef9df8eddf39431a8beba1e5deec.png](https://i-blog.csdnimg.cn/blog_migrate/0e062e170a787b0aa8289a1bd3a6aa00.jpeg)
II、try ... catch ... finally
![85543cead29f2b14166fc4c65ee261a0.png](https://i-blog.csdnimg.cn/blog_migrate/24e9d6d4281986b6dd23242bccb3b372.jpeg)
![dabfaab07b4008e27a21794c6fbdc21f.png](https://i-blog.csdnimg.cn/blog_migrate/47b7cd100b69f2c2929d063b16350208.jpeg)
最终执行了 finally
III、throws 和 throw
throws 是用于在方法声明抛出的异常,而 throw 是用于抛出异常。
throw 关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块中的异常,受查异常和非受查异常都可以被抛出。
throws 关键字用在方法声明上,可以抛出多个异常,用来标识该方法可能抛出的异常列表。一个方法用 throws 标识了可能抛出的异常列表,调用该方法的方法中必须包含可处理异常的代码,否则也要在方法签名中用 throws 关键字声明相应的异常。
![112f8bd9e637722fa31b46e363e9a965.png](https://i-blog.csdnimg.cn/blog_migrate/4558dfd328d6429262f42a1c36fd1fcc.jpeg)
自定义异常
![b70b401b264c6a6a30e81a300bd67fad.png](https://i-blog.csdnimg.cn/blog_migrate/cc23c764a2ffa95e5e46a9e0aed72794.jpeg)
5、易混淆地方
当 catch 出现多次,程序如何执行?
![679a51b7ac41ac419501bc95b7f20862.png](https://i-blog.csdnimg.cn/blog_migrate/8512e3232c4ce516357caeca8b174884.jpeg)
输出结果:
![9b4cfef0c6b21e2d4486728c2145e8b6.png](https://i-blog.csdnimg.cn/blog_migrate/d7492cdbf2ee9a713b1e069d6b73068c.jpeg)
catch (Exception e) 一定要放到最后面,当有多个 catch 时,相当于 if-else if-else 语句,只执行其中一个。