Python异常处理

一:什么是异常?

异常时错误发生的信号,一旦程序出错 就会产生一个异常。
如果该异常没有被处理,该异常就会被抛出来,程序的运行随即终止。

 

异常组成的3部分

1.Traceback:异常的追踪/回溯信息,定位到哪一行代码抛出了问题
2.XXXError:异常的种类
3.XXXError后的内容:异常的内容信息
 

错误的2种方式:

①语法错误(SyntaxError):缺少:或者(等语法错误。
②逻辑错误(Name/Index/Key Error):变量未定义就直接使用等逻辑错误。
# 逻辑错误
NameError:变量名未定义
    x = 1
    print(y)
    
IndexError:索引不存在
    l = [1,2,3]
    print(l[100])
    
KeyError:键不存在
    d = {'k1':'asd'}
    print(d['a'])

AttributeError:对象的属性不存在
    对象.属性
    
TypeError:类型错误
    'asd'+111
 

二:为何要处理异常?

 

1.为了增强程序的 健壮性(鲁棒性),即便是程序运行过程中出错了,也不要终止程序

 

2.而是捕捉异常并处理:将出错信息记录到日志内

 

三:如何处理异常

 

1.针对 语法的错误:应该在程序运行前,立即改正

 

2.针对 逻辑的错误:例如先定义,后使用,要尽量避免

 

3.如果逻辑错误发生的条件是可以预知的,应该用if判断拿来解决,预防异常

 

4.如果逻辑错误发生的条件是不可预知的,那么异常一定会发生,考虑带程序的健壮性,我们应该处理异常,做好补救措施(能不写尽力不写)

try:
    代码块
except 异常的类型:
    发生异常后要执行的代码
 

四:例子

 

1.遇到异常,程序直接终止

try:
    print("====>111")
    print("====>222")
    xxx
    # 遇到异常后,程序直接退出,后面的代码不会执行
    print("====>333")   
except AttributeError as e:
    print(e)

print('====>4')

# 输出:
# NameError: name 'xxx' is not defined
# ====>111
# ====>222
 

2.指定异常

try:
    print("====>111")
    print("====>222")
    xxx
    print("====>333")
except NameError as e:  # 指定异常的类型(需要知道会抛出哪些异常)
    print(e)
print('====>4')

# 输出
# ====>111
# ====>222
# name 'xxx' is not defined
# ====>4
 

3.合并抛出异常

try:
    print("====>111")
    print("====>222")
    # xxx
    l=[]
    l[0]
    dic = {}
    # dic["k1"]
    print("====>333")
except (NameError, IndexError) as e:    # 可以将2种异常合并输出
    print("=---->", e)
except KeyError as e:
    print(e)
print('====>4')

# 输出
# ====>111
# ====>222
# =----> list index out of range
# ====>4
 

4.finally不管有无异常,都会输出

try:
    print("====>111")
    print("====>222")
    xxx = 111
    # l=[]
    # l[0]
    dic = {}
    # dic["k1"]
    print("====>333")
except (NameError, IndexError) as e:
    print("=---->", e)
except KeyError as e:
    print(e)
finally:    # 不管是否有异常,都会执行
    print("一定会运行")
print('====>4')

# 输出:
# ====>111
# ====>222
# ====>333
# 一定会运行
# ====>4
 

5.万能异常Exception

try:
    print("====>111")
    print("====>222")
    # xxx
    l = []
    # l[0]
    dic = {}
    dic["k1"]
    print("====>333")
except Exception as e:  # 万能异常,可以接收任何类型的异常
    print("万能异常", e)
print('====>4')

# 输出:
# ====>111
# ====>222
# 万能异常 'k1'
# ====>4
 

6.自定义异常

print('==>11')
raise NameError("变量名未定义")
print('==>222')

# 输出:
# NameError: 变量名未定义
class Animal:
    def speak(self):
        raise BaseException("小垃圾必须实现speak方法来覆盖")

class Dog(Animal):
    pass

d = Dog()
d.speak()

# 输出:
# BaseException: 小垃圾必须实现speak方法来覆盖
class Interface(BaseException):
    def __init__(self, msg, x, y, z):
        self.msg = msg
        self.x = x
        self.y = y
        self.z = z

    def __str__(self):
        return "<%s:%s:%s:%s>" % (self.msg, self.x, self.y, self.z)


raise Interface("接口异常", 11, 22, 33)

# 输出:
# __main__.Interface: <接口异常:11:22:33>
 

7.断言assert

print("====1")
print("====2")
print("====3")
salaries = [1.1, 2.2]

# if len(salaries) != 3:
#     raise NameError
assert len(salaries) == 3

print(salaries[2])

# 输出:
# AssertionError
# ====1
# ====2
# ====3
posted @ 2020-08-15 12:06  Οo白麒麟оΟ  阅读(217)  评论(0编辑  收藏  举报