python-异常处理

异常处理
逻辑错误
在程序运行中出现的错误
语法错误
过不了python的解释器,必须在程序执行前改正
异常种类
AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
异常
异常发生后,异常之后的代码不再执行
异常处理
提高程序健壮性,出现异常,程序不会崩溃
语法
try except else finally
 1 # 捕获异常
 2 try:
 3     a = [1,2]
 4     print(a[2])
 5 except IndexError as e:
 6     print(e)
 7 except KeyError as e:
 8     print(e)
 9 except Exception as e :
10     print(e)
11 else:
12     print('try内代码块没有异常则执行我')
13 finally:
14     print('无论异常与否,都会执行该模块,通常是进行清理工作')
 1 # finally,else 与return
 2 def f():
 3     try:
 4         a = [1, 2]
 5         # print(a[2])
 6         print('in try')
 7         # return 'return_try'
 8     except IndexError as e:
 9         print(e)
10         print('in IndexError')
11         return 'return_IndexError'
12     else:
13         print('in else')
14         return 'return_else'
15     finally:
16         print('无论异常与否,都会执行该模块,通常是进行清理工作')
17         print('in finally')
18         return 'return_finally'
19 print(f())
20 # 总结
21 # “如果try中没有异常,那么except部分将跳过,执行else中的语句。(前提是try里没有返回值)
22 # finally是无论是否有异常,最后都要做的一些事情。”(无论try里是否有返回值)
23 # 这里补充一句,在含有return的情况下,并不会阻碍finally的执行。(但是会阻碍else)
24 # 不要在try else里写返回值。如果没有finally,就写在最后,或者只写在finally里。
25 # try except else里都是做某事   而不是处理返回
finally,else 与return
1 # 主动触发异常
2 try:
3     raise TypeError('类型错误')
4 except Exception as e:
5     print(e)
主动触发异常
 1 class EvaException(BaseException):
 2     def __init__(self, msg):
 3         self.msg = msg
 4 
 5     def __str__(self):
 6         return self.msg
 7 
 8 
 9 try:
10     raise EvaException('类型错误')
11 except EvaException as e:
12     print(e)
13 except Exception as e:
14     print(e)
15 finally:
16     print('end')
自定义异常
1 # 断言是用来检查非法情况而不是错误情况的,用来帮开发者快速定位问题的位置。
2 # 对一个函数而言,一般情况下,断言用于检查函数输入的合法性,要求输入满足一定的条件才能继续执行;
3 # 在函数执行过程中出现的异常情况使用异常来捕获。
4 # assert 1 ==1
5 # assert 1 ==2
6 # v1 = 1
7 # v2 = 2
8 # assert (v1 > v2),'{0} is not bigger than {1}'.format(v1,v2)
断言

 

posted @ 2018-09-28 23:46  写bug的日子  阅读(182)  评论(0编辑  收藏  举报