Python | 异常处理

 

本文内容:

1. 处理异常的一般方法

2. 捕获具体异常

3. 捕获具体异常的描述信息

4. 构造异常的方法

5. 嵌套异常的处理机制

6. 自定义异常

 

正文:

1. 处理异常的一般方法

 1 try:
 2     print("'haha")  # 会执行,问题代码之前的内容会执行了
 3     print(a)  # 之前并没有定义a,肯定会出错
 4 
 5 except:
 6     print("e")
 7 
 8 """
 9 执行后会打印:
10 'haha
11 e
12 """

 

当在try中打开了文件或者链接资源,在finally中关闭
 1 try:
 2     f = open("180.1.txt", "w")
 3     f.read("hhhh")
 4     # f.close()
 5 
 6 except:
 7     print("写入失败")
 8 
 9 finally:
10     # finally中的代码总会执行,无论执行try或是执行except
11     f.close()
12 
13 """
14 执行后会打印:
15 写入失败
16 """

 

异常处理完整的语法格式

try:
可能引发异常现象的代码
except:
出现异常现象后的 处理代码
else:
未出现异常现象的 处理代码(try中所有代码顺利执行后,会执行)
finally:
整个代码块结束时会执行的代码,用作 清理(无论异常出现与否,都会执行的代码)
 1 try:
 2     f = open("180.1.txt", "w")
 3     f.read("haha")
 4 
 5 except:
 6     print("写入异常")
 7 
 8 else:
 9     print("成功写入")
10 
11 finally:
12     f.close()
13     print("程序结束")
14 
15 """
16 执行程序,打印:
17 写入异常
18 程序结束
19 """

 

2. 捕获具体异常

 1 try:
 2     a = "hello python"
 3     print(a)
 4     print(a.index("o"))
 5     print(2/0)
 6     # open("w","r")
 7 except NameError:
 8     print("没有找到变量a")
 9 
10 except ValueError:
11     print("未找到被查询的内容...")
12 
13 except ZeroDivisionError:
14     print("除零错误")
15 
16 except Exception:
17     print("未知错误")
18 
19 """
20 执行程序,打印:
21 hello python
22 4
23 除零错误
24 """

 

3. 捕获具体异常的描述信息

 1 try:
 2     b = 2/0
 3 
 4 except ZeroDivisionError as error:
 5     print("错误:" + str(error))  # error 是个对象,要转化成字符串,才能和字符串执行 加 的操作
 6 
 7 """
 8 执行程序,打印:
 9 错误:division by zero
10 """

 

4. 构造异常的方法

raise 错误的类名(错误信息)    错误信息是个参数
[reɪz]
1 raise ValueError("错啦错啦")
2 
3 """
4 执行程序,打印:
5 File "/xxxxx/异常出现原理.py", line 1, in <module>
6     raise ValueError("错啦错啦")
7 ValueError: 错啦错啦
8 """

再如,除零错误就是这样构造的

1 raise ZeroDivisionError("division by zero")
2 
3 """
4 执行程序,打印:
5 File "/xxxxx/异常出现原理.py", line 1, in <module>
6     raise ZeroDivisionError("division by zero")
7 ZeroDivisionError: division by zero
8 """

 

5. 嵌套异常的处理机制

 1 try:
 2     try:
 3         # print(b)  # 如果先遇到本行,此try代码块中没有解决方法,则跳出,去到外层的except里。执行程序,打印:name 'b' is not defined
 4 
 5         a = 1/0  # 如果本行写在第一行,则在本个try代码块的except就能解决问题,外层的try中的代码相当与顺利执行,不会惊动外层的except,执行程序,打印:division by zero
 6     except ZeroDivisionError as error:
 7         print(error)
 8 
 9 except NameError as error:
10     print(error)

 

6. 自定义异常

自定义异常
class 自定义异常类名(Exception):
pass

主动触发异常现象
raise 异常类对象
 1 class NameError(Exception):
 2     pass
 3 
 4 
 5 def check_name(name):
 6     if name.find("") >= 0:
 7         # print()
 8         raise NameError("名字违规了")
 9 
10 
11 # 调用时
12 try:
13     check_name("朱自")
14 
15 except Exception as e:
16     print(str(e))

 

posted @ 2019-08-01 10:24  机器快点学习  阅读(210)  评论(0编辑  收藏  举报