异常
异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下:
异常总体上可分为2大类:
1,语法错误导致的异常:,出现此异常程序就崩溃终止,后续代码不会在运行,所以应该在程序运行前就修正;
2,逻辑上的异常, 处理方式: try..except..
异常处理:
python解释器检测到错误,触发异常(也允许程序员自己触发异常).
程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关),如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理.
异常处理原因:
python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件.
所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性.
什么时候用异常处理:
try...except应该尽量少用,因为它本身就是你附加给你的程序的一种异常处理的逻辑,与你的主要的工作是没有关系的
这种东西加的多了,会导致你的代码可读性变差
而且异常处理本就不是你2b逻辑的擦屁股纸,只有在有些异常无法预知的情况下,才应该加上try...except,其他的逻辑错误应该尽量修正
异常处理方法:
1,if判断
def test(): print(‘test running‘) choice_dic={ ‘1‘:test } while True: choice=input(‘>>: ‘).strip() if not choice or choice not in choice_dic:continue #这便是一种异常处理机制啊 choice_dic[choice]()
2,try..except..
try: 被检测的代码块 except 异常类型: try中一旦检测到指定的异常类型,则执行此位置的逻辑代码
需要注意的是:异常类只能用来处理指定的异常情况,如果非指定异常则无法处理.
s1 = ‘hello‘ try: int(s1) except IndexError as e: print(e) 运行结果: Traceback (most recent call last): File "J:/Python_Project/day09/练习/123.py", line 77, in <module> int(s1) ValueError: invalid literal for int() with base 10: ‘hello‘
3,万能异常Exception
可以捕获任意的异常
s1 = ‘hello‘ try: int(s1) except Exception as e: print(e) 运行结果: invalid literal for int() with base 10: ‘hello‘
4,虽然万能异常好用,但是也要分情况,如果要对不同的异常定制不同的处理方式,就需要用到多分支了.
s1 = ‘hello‘ try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e) except Exception as e: # 可以在最后,来一个万能异常 print(e)
5,其他形式处理
s1 = ‘hello‘ try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e) #except Exception as e: # print(e) else: print(‘try内代码块没有异常则执行我‘) finally: print(‘无论异常与否,都会执行该模块,通常是进行清理工作‘)
6,主动出发异常
#_*_coding:utf-8_*_ try: raise TypeError(‘类型错误‘) except Exception as e: print(e) 运行结果: 类型错误
7,自定义异常
#_*_coding:utf-8_*_ __author__ = ‘Linhaifeng‘ class EgonException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msg try: raise EgonException(‘类型错误‘) except EgonException as e: print(e)
总结:
try..except的方式比较if的方式的好处:
if本身就可以来处理异常,只不过if的方式,对于不同代码段的同一种异常,需要重复写多分支的if,而这段多分支if与真正的工作无关,写多了你的程序可读性就会及其的差。
try..except的方式,只是python提供给你一种特定的语法结构去做这件事,对于不同代码的同一种异常,python为你定制了一中类型,一个expect就可以捕捉到
try..except这种异常处理机制就是取代if那种方式,让你的程序在不牺牲可读性的前提下增强健壮性和容错性,
异常处理中为每一个异常定制了异常类型(python中统一了类与类型,类型即类),对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需‘写多个if判断式’)减少了代码,增强了可读性
#_*_coding:utf-8_*_ #if方式处理异常 # num1=input(‘>>: ‘) #输入一个字符串试试 # if num1.isdigit(): # int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴 # elif num1.isspace(): # print(‘输入的是空格,就执行我这里的逻辑‘) # elif len(num1) == 0: # print(‘输入的是空,就执行我这里的逻辑‘) # else: # print(‘其他情情况,执行我这里的逻辑‘) #第二段代码 # num2=input(‘>>: ‘) #输入一个字符串试试 # int(num2) #第三段代码 # num3=input(‘>>: ‘) #输入一个字符串试试 # int(num3) #try..except..方式处理 try: #第一段代码 num1=input(‘>>: ‘) #输入一个字符串试试 int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴 #第二段代码 num2=input(‘>>: ‘) #输入一个字符串试试 int(num2) #第三段代码 num3=input(‘>>: ‘) #输入一个字符串试试 int(num3) except ValueError as e: print(e)
使用try..except的方式
1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;