26 day of python
异常处理
1, 语法错误: 你程序未执行之前,pycharm已经给你做了提示了,
name if 1 > 0; pass age == 3
2, 逻辑错误
num = int(input('>>>'))
可预知,不可预知的,
你见过的异常:
num = int(input('>>>')) #ValueError name # NameError if 1 > 0; # SyntaxError dic = {} dic['key'] # KeyError li = [1,2,3] li[10] # IndexError import ac # ImportError
什么是异常??
由错误引发的,而且出现异常就会终止程序。
为什么要进行异常处理:
1,异常就会终止程序员,用户体验极差,
2,让你的代码不冗余。
异常处理:
1,if,异常处理 他只能处理简单的逻辑。
num = input('>>>') if num.isdigit(): num = int(num): if 1<= num <=5: if else: print('有非数字类型....')
2,try.异常处理
遇到报错信息,防止程序终止,执行另一个语句.
2.1 单独一个条件.单支.
try: num = int(input('>>>')) # ValueError name # NameError # if 1 > 0; # SyntaxError dic = {} dic['key'] # KeyError li = [1,2,3] li[10] # IndexError import ac # ImportError except NameError: print('出现了NameError错误') print(111) print(222) print(333) print(114441)
出现了NameError错误
111
222
333
114441
多分支。
try: num = int(input('>>>')) #ValueError name # NameError dic = {} dic['key'] # KeyError li = [1,2,3] li[10] # IndexError import ac # ImportError except NameError: print('出现了NameError错误') except ValueError: print('出现了ValueError错误') except KeyError: print('出现了KeyError错误') print(222) print(333) print(114441)
class A:
def __str__(self):
return 'list index out of range'
a1 = A()
print(a1)
3 万能异常处理。
try: # num = int(input('>>>')) #ValueError # name # NameError dic = {} # dic['key'] # KeyError li = [1,2,3] li[10] # IndexError import ac # ImportError except Exception as e: # print('您输入的不规范,请重新输入...') print('稍等片刻,去去就来...')
异常处理的两种解决方式:
1,只是显示错误信息,不终止程序就行。万能的
2,针对不同的错误,提示不同的信息,进行不同的操作。 多分支
def login(): pass def regsiter(): pass def article(): pass def dariy(): pass dic = { 1:login, 2:regsiter, 3:article, 4:dariy, } while True: choice = input('请输入:') if choice.isdigit(): choice = int(choice) if 1 <= choice <=4: dic[choice]() else: print('请范围内的数字...') else: print('请输入数字...')
def login(): pass def regsiter(): pass def article(): pass def dariy(): pass dic = { 1:login, 2:regsiter, 3:article, 4:dariy, } while True: try: choice = int(input('请输入:')) dic[choice]() except ValueError: print('请输入数字...') except KeyError: print('请范围内的数字...')
4 多分支+万能.
while True: try: choice = int(input('请输入:')) dic[choice]() except ValueError: print('请输入数字...') except Exception as e: print(e) except KeyError: print('请范围内的数字...') try: choice = int(input('请输入:')) except ValueError: print('请输入数字...') except KeyError: print('请范围内的数字...') except Exception as e: print(e)
2.5 try except except ... else
如果程序出现异常执行except,就不会执行else,反之则执行else
try: print('我的卡扣除100元') print('旭哥的卡增加了100元') except NameError: print('转账出现异常...') else: print('转账成功')
2.6
try except except ... else .finally
try finally
try: print('我的卡扣除100元') name print('旭哥的卡增加了100元') except NameError: print('转账出现异常...') else: print('转账成功') finally: print('6666666')
name print(666) # 666不执行 try: name finally: print(666) # 666执行了
try: f = open('t1',encoding='utf-8') print(f.read()) '''多个文件句柄的操作''' f.write() finally: f.close() print(666) # 最后close() # f.close()
def func(): try: return 555 finally: '''代码块''' print(777) func() try finally 关闭文件句柄,关闭数据库的链接,关闭网络链接等等
2.7 主动触发异常
raise TypeError('类型错误')
class Payment: def pay(self,money): raise TypeError('你的类中应该有一个pay方法') class QQ(Payment): def pay(self,money): print('您用qq支付了%s元' % money) class Wechat(Payment): def pay(self,money): print('您用微信支付了%s元' % money) def pay(obj,money): obj.pay(money) #a1.pay(200) q1 = QQ() w1 = Wechat() pay(w1,1000)
2.8 自定义异常(大项目,针对于python不具备的一些错误类型.)
raise TypeError('类型错误')
name1 : python解释器没法解决的错误: 周星星
class 周星星(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msg # # raise EvaException('EvaException:错误!!!!' ) # # raise TypeError('EvaException:错误!!!!' ) try: raise 周星星('EvaException:错误!!!!' ) except 周星星 as e: # e = EvaException('类型错误') print(e)
断言 源码 主动抛出异常
condition = 1 > 2 assert condition # 如果条件不满足强行终止. print(111) print(222) print(113331) print(5455) if 1 == 2: print(111) print(222) print(113331) print(5455)
1,try ...except 单个情况
2,try except except..... 多分支,针对多个你已知的异常,分别导向不同的代码. *
3,try except Exception as e: 万能异常处理. 你对出现的异常错误未知,你要用万能的. *
# 1,只是显示错误信息,不终止程序就行. 万能的
# 2,针对不同的错误,提示不同的信息,进行不同的操作. 多分支,多分支+ 万能
4,try except except except Exception as e: 多分支 + 万能 *
5,try except except... else 出现异常就不执行else代码反之则执行.
6,
try except except... else,finally 不常用
try finally * 涉及到关闭文件句柄,网络链接,数据库链接等等.
7, raise
8, 自定义异常处理.
9 assert
try except except ... else .finally
try finally