知识内容:
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)