1、异常简介
异常就是程序运行错误或者逻辑混乱。需要给客户友好的提示。
异常一般是程序中无法完全避免,一般通过一定的手段,尽量减少异常的发生。
异常:
当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"
2、捕获异常
2.1捕获异常 try...except...
- 把可能出现问题的代码,放在try中
- 把处理异常的代码,放在except中
- except后不写任何类,表示捕捉任何异常
- 这种结构虽然能捕捉异常,但是代码的速度有所降低,所以,只能把可能的出现异常的代码放到try 与 except之间
2.2except捕获多个异常
- 如果想通过一次except捕获到多个异常可以用一个元组的方式#except (IOError,NameError):
- errorMsg里会保存捕获到的错误信息 #print(errorMsg)
- 当出现异常。其实解析器会被这种异常分析,实例化得到一个异常对象xx,然后再与except里的异常类进行匹配,如果能匹配,as将异常对象赋给ex
path = input('输入文件的路径:') content = None try: content = open(path,'r',encoding='utf-8').read() except FileNotFoundError as ex: print('4......') print('输入的路径不存在') print(ex) print('5......') print(content)
2.3异常处理没有作用域
- python中只有函数里和类里有作用域,其它都没有
- 这里的ex是局部变量,其它都是全局变量
2.4捕获所有异常
- 开发的时候建议,捕捉异常要写的更详细。
- 但是一般直接用Exception。简单省事。
- 如果需要写很多异常类的描述,按照从小到大的顺序。因为有一个捕捉到了异常。不会再被捕捉了。
2.5else
- 在if中,它的作用是当条件不满足时执行的实行
- 同样在try...except...中也是如此,即如果没有捕获到异常,那么就执行else中的事情
2.6finally
- 在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。
- 比如文件关闭,释放锁,把数据库连接返还给连接池等
3、异常的传递
3.1try的嵌套
import time try: #f = open('test.txt') f = open(r'C:\Users\Administrator\Desktop\xx.txt') try: while True: content = f.readline() if len(content) == 0: break num=1/0 #模拟一个异常 #time.sleep(2) print(content) #except: #print('except...') finally: f.close() print('关闭文件') except: print('没有这个文件')
3.2函数嵌套调用
def test1(): try: print("----test3-1----") test1() print("----test3-2----") except Exception as result: print("捕获到了异常,信息是:%s"%result) print("----test3-2----") test1()
总结
- 如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。
4、抛出自定义的异常
- 用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类
class NameShortException(Exception): def __init__(self,msg,num): self.msg = msg self.num = num def f(): '''这是输入姓名并判断,如果姓名的长度小于3,抛出NameShortException异常''' name = input('请输入姓名:') if len(name.strip())<3: #手动抛出一个异常对象,以后的代码不再运行 raise NameShortException('名字的长度至少是3',len(name.strip())) print('f......') def main(): try: f() except Exception as ex: print('错误信息是:%s,输入的字符串长度是:%s'%(ex.msg,ex.num)) print('其它代码。。。。。。。') main() #请输入姓名:12 #错误信息是:名字的长度至少是3,输入的字符串长度是:2 #其它代码。。。。。。。
以后在mvc框架中,都会有异常处理。在最外层进行处理。 try: #你写的代码 except Exception as ex: 将异常信息写到日志文件中 else: finally: print('over......') 所以,你写的代码可以处理异常,也可以不处理。 一般要写一定的异常处理,为了让代码继续运行。 还有,可以将异常继续抛出。为了让系统异常日志记录下来
class SexException(Exception): def __init__(self,msg,value): self.msg = msg self.value = value def f1(): sex = input('请输入性别:') if sex!='男' and sex!='女': raise SexException('性别只能输入男或者女',sex) print('f1...over.....') def f2(): #num = 1/0 # raise ZeroxxxError('除以0 了,不行') f1() print('f2...over.....') def main(): try: f2() except Exception as ex: #print(ex.msg) raise print('main...over.....') #框架 try: #你的代码 main() except Exception as ex: #将错误信息写到文件中记录下来,打印模拟记录 print(ex)
来源:https://www.cnblogs.com/cjr0707/p/9695059.html