python异常处理

知识内容:

1.异常与异常处理

2.python中的异常处理结构

3.断言与上下文管理

 

 

 

一、异常与异常处理

1.异常

简单的说异常是程序运行时引发的错误,引发错误的原因有很多,例如除0、下标越界、文件不存在等,这些错误如果不得到正确处理将会导致程序终止运行,而合理地使用异常结构可以使程序更加健壮,具有更好地容错性,另外在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是给出一个提示的页面

简单定义: 异常就是程序运行时发生错误的信号,如果不处理程序就会停止并报出这个信号

实例如下图

常见的异常如下:

 1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
 2 IOError 输入/输出异常;基本上是无法打开文件
 3 ImportError 无法引入模块或包;基本上是路径问题或名称错误
 4 IndentationError 语法错误(的子类) ;代码没有正确对齐
 5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
 6 KeyError 试图访问字典里不存在的键
 7 KeyboardInterrupt Ctrl+C被按下
 8 NameError 使用一个还未被赋予对象的变量
 9 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
10 TypeError 传入对象类型与要求的不符合
11 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
12 导致你以为正在访问它
13 ValueError 传入一个调用者不期望的值,即使值的类型是正确的

 

 

2.异常处理

为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理,这就是异常处理

异常处理的方法:

(1)在程序中判断处理

1 a, b = input("计算除法,输入两个数: ").strip().split()
2 
3 if int(b) == 0:
4     print("第二个数不能为0!")
5     exit()
6 
7 a, b = int(a), int(b)
8 print("%d/%d=%.2f" % (a, b, a/b))

 

(2)使用python中的异常处理结构

1 try:
2     被检测的代码块
3 except 异常类型:
4     try中一旦检测到异常,就执行这个位置的逻辑

代码如下

1 try:
2     a, b = input("计算除法,输入两个数: ").strip().split()
3     a, b = int(a), int(b)
4     print("%d/%d=%.2f" % (a, b, a/b))
5 
6 except ZeroDivisionError:
7     print("除数不能为0!")

 

 

 

二、python中的异常处理结构

1.try...except结构

 1 try:
 2     代码      # 被监控的语句,可能会发生异常
 3 except 异常名:
 4     代码      # 处理异常的代码
 5 
 6 # 捕获所有类型的异常
 7 try:
 8     代码      # 被监控的语句,可能会发生异常
 9 except Exception [as reason]:
10     代码      # 处理异常的代码

 

 

2.try...except...else结构

1 try:
2     代码      # 被监控的语句,可能会发生异常
3 except 异常名:
4     代码      # 处理异常的代码
5 else:
6     代码      # 捕获了异常就不执行,否则就执行

 

 

3.try...except...finally结构

1 try:
2     代码      # 被监控的语句,可能会发生异常
3 except 异常名:
4     代码      # 处理异常的代码
5 finally:
6     代码      # 无论如何都会执行

 

异常处理实例:

 1 try:
 2     mylist = [4, 6]
 3     print(mylist[10])
 4     print("This is never been called")
 5 
 6 except ZeroDivisionError as e:    # 异常ZeroDivisionError被捕获执行以下代码
 7     print("ZeroDivisionError happened")
 8     print(e)
 9 
10 except (IndexError, EOFError) as e:  # 异常IndexError, EOFError被捕获执行以下代码
11     print("Exception happened")
12     print(e)
13 
14 except ...:         # 其他异常被捕获执行以下代码:
15     print("Unknown exception happened")
16 
17 else:               # 没有出现异常时执行以下代码:
18     print("There is no exception")
19 
20 finally:            # 无论是否出现异常都执行以下代码:
21     print("Process finished!")

 

 

 

三、断言与上下文管理

断言与上下文管理是特殊的异常处理方式,在形式上比异常结构要简单一点,能够满足简单的异常处理或条件确认,并可以和标准的异常处理结构结合使用

1.断言

语法: assert expression [, reason]

当expression为真时,什么都不做,为假时则抛出异常(reason)

1 >>> try:
2 ...     assert 1==2, "1 is not equal to 2"
3 ... except AssertionError as reason:
4 ...     print("%s:%s"%(reason.__class__.__name__, reason))
5 ...
6 AssertionError:1 is not equal to 2

 

 

2.上下文管理

使用上下文管理语句with可以自动管理资源,在代码块执行完毕后自动还原进入该代码块之前的现场或上下文

另外不管以何种原因跳出with语句,也不论是否发生异常,总能保证资源被正常释放,大大简化了工作

语法:

with context_expr [as var]:

  代码块

1 with open("test.txt") as f:
2     for line in f:
3         print(line)

 

posted @ 2018-04-26 05:04  woz333333  阅读(272)  评论(0编辑  收藏  举报