什么是异常?
异常发生之后在他后面的代码就不执行了。
为什么要进行异常处理?
不处理你的程序还怎么运行?
异常处理的方法:
1,使用if判断语句
1 num1=input('>>: ') #输入一个字符串试试 2 int(num1)
1 num1=input('>>: ') #输入一个字符串试试 2 if num1.isdigit(): 3 int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴 4 elif num1.isspace(): 5 print('输入的是空格,就执行我这里的逻辑') 6 elif len(num1) == 0: 7 print('输入的是空,就执行我这里的逻辑') 8 else: 9 print('其他情情况,执行我这里的逻辑') 10 11 ''' 12 问题一: 13 使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂 14 问题二: 15 这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。 16 '''
总结:
1、if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要重复的if来进行处理。
2、在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差
3、if是可以解决异常的,只是存在1、2的问题,所以,千万不要妄下定论if不能用来异常处理
1 def test(): 2 print('test running') 3 choice_dic={ 4 '1':test 5 } 6 while True: 7 choice=input('>>: ').strip() 8 if not choice or choice not in choice_dic:continue #这便是一种异常处理机制啊 9 choice_dic[choice]()
Python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理
基本语法:
try: 被检测的代码块 except 异常类型: try中一旦检测到异常,就执行这个位置的逻辑
1 f = open('a.txt') 2 g = (line.strip() for line in f) 3 for line in g: 4 print(line) 5 else: 6 f.close()
1 try: 2 f = open('a.txt') 3 g = (line.strip() for line in f) 4 print(next(g)) 5 print(next(g)) 6 print(next(g)) 7 print(next(g)) 8 print(next(g)) 9 except StopIteration: 10 f.close() 11 ''' 12 next(g)会触发迭代f,依次next(g)就可以读取文件的一行行内容,无论文件a.txt有多大,同一时刻内存中只有一行内容。 13 提示:g是基于文件句柄f而存在的,因而只能在next(g)抛出异常StopIteration后才可以执行f.close() 14 '''
异常类智能用来处理指定的异常情况,如果非指定类则无法处理,报错
1 s1 = 'hello' 2 try: 3 int(s1) 4 except IndexError as e: 5 print(e) 6 '''ValueError写为IndexError,错误'''
多分枝:一个try里可以有多个except;
万能异常:Exception-----------可以捕获任意异常
try......except 中的else语句,在try代码块内没有异常则执行
finally 语句,无论有没有异常都执行
1 #主动触发异常 2 try: 3 raise TypeError('类型错误') 4 except Exception as e: 5 print(e)
1 #自定义异常 2 class EvaException(BaseException): 3 def __init__(self,msg): 4 self.msg=msg 5 def __str__(self): 6 return self.msg 7 try: 8 raise EvaException('类型错误') 9 except EvaException as e: 10 print(e)
断言(assert)+判断,正确执行下边的,错误从该位置终止程序。