首页 > 代码库 > 20-异常处理

20-异常处理

异常
异常就是程序运行时发生错误的信号,在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:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;
 

20-异常处理