python 异常处理
一 什么是异常
异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),
在python中,错误触发的异常如下
错误分成两种
1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)
#语法错误示范一 if #语法错误示范二 def test: pass #语法错误示范三 class Foo pass #语法错误示范四 print(haha)
2.逻辑错误
#TypeError:int类型不可迭代 for i in 3: pass #ValueError num=input(">>: ") #输入hello int(num) #NameError aaa #IndexError l=['egon','aa'] l[3] #KeyError dic={'name':'egon'} dic['age'] #AttributeError class Foo:pass Foo.x #ZeroDivisionError:无法完成计算 res1=1/0 res2=1+'str'
二 异常的种类
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
三 异常处理
为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理
如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理
#基本语法为 try: 被检测的代码块 except 异常类型: try中一旦检测到异常,就执行这个位置的逻辑
平常报错
while True: num1 = input('num1:') num2 = input('num2:') num1 = int(num1) num2 = int(num2) result = num1 + num2 break ''' num1:alex num2:123 Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/ss/SSS/day7/S13 面向对象/异常处理1.py", line 10, in <module> num1 = int(num1) ValueError: invalid literal for int() with base 10: 'alex' '''
四 try..except...详细用法
默认情况下会执行try: 里面的代码 如果try:里面的代码不执行的 except里面代码不执行
如果try里面的代码报错了,会执行except里面代
while True: num1 = input('num1:') num2 = input('num2:') try: num1 = int(num1) num2 = int(num2) result = num1 + num2 # e 就是封装的错误信息 except Exception as e: print('出现异常,信息如下:') print(e) break ''' num1:alex num2:123 出现异常,信息如下: invalid literal for int() with base 10: 'alex' '''
ValueError
while True: num1 = input('num1:') num2 = input('num2:') try: num1 = int(num1) num2 = int(num2) result = num1 + num2 # e 就是封装的错误信息 except ValueError as e: print('出现异常,信息如下:') print(e) break
定义多种错误类型
while True: num1 = input('num1:') num2 = input('num2:') try: li = [1,2,3] print(li[4]) num1 = int(num1) num2 = int(num2) result = num1 + num2 # e 就是封装的错误信息 except ValueError as e: print('出现异常,信息如下:') print(e) except IndexError as e: print('出现异常,信息如下:') print(e) break ''' num1:alex num2:a Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/ss/SSS/day7/S13 面向对象/异常处理4.py", line 12, in <module> print(li[4]) IndexError: list index out of range ''' ''' num1:alex num2:123 出现异常,信息如下: list index out of range '''
一次性捕获所有错误
Exception 要放在错误类型 的最后
while True: num1 = input('num1:') num2 = input('num2:') try: li = [1,2,3] print(li[4]) num1 = int(num1) num2 = int(num2) result = num1 + num2 # e 就是封装的错误信息 except ValueError as e: print('出现异常,信息如下:') print(e) except IndexError as e: print('出现异常,信息如下:') print(e) # 捕获所有错误 except Exception as e: print('出现异常,信息如下:') print(e) break
异常处理完整代码块
try: pass except ValueError as e: print(e) except Exception as e: print(e) else: pass finally: pass ''' 有报错执行 except 都不报错 执行else finally 不管报错 不报错都执行 '''
try: print("helo") except ValueError as e: print(e) except Exception as e: print(e) else: print("正常") finally: print("不管报错 不报错都执行") ''' helo 正常 不管报错 不报错都执行 '''
主动触发异常
raise Exception
执行 except Exception as e:
print(e) 语句 = 主动错误一下
try: raise Exception("主动错误一下") print("123") except ValueError as e: print(e) except Exception as e: print(e) else: pass finally: pass # 主动错误一下
自定义异常
''' 写一个类名为MikeException 的异常 self.message = msg = “我的异常” MikeException('我的异常') 把 “我的异常” 传进去 ''' class MikeException(Exception): def __init__(self, msg): self.message = msg def __str__(self): return self.message try: raise MikeException('我的异常') except MikeException as e: print(e) ''' print(e) 先执行 str方法 def __str__(self): return self.message 所以最后打印 "我的异常" ''' # 我的异常
断言
# 如果条件不成立 报错 assert 1==2 ''' Traceback (most recent call last): File "C:/Users/Administrator.QH-20170325TNQR/PycharmProjects/SSSSS/SS/day7/S13 面向对象/异常处理8 断言.py", line 8, in <module> assert 1==2 AssertionError ''' assert 1==1
# 如果条件成立 不报错 assert 1==1