第十一章:python之异常处理

第十一章:python之异常处理

一、什么是异常

异常: 程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行也会随之终止,如下例子:

print('start run...')
(1,2,3,4,5)(99)
print('stop run...')
# TypeError: 'tuple' object is not callable

二、为何要做异常处理

# 为了增强程序的健壮性,即便是程序运行过程中出错了,也不要终止程序
# 而是捕捉异常并处理:将出错信息记录到日志内

三、异常的三个组成部分

# 异常的追踪信息
# 异常的类型
# 异常的内容

常见的错误类型

# 4.1 语法错误:SyntaxError
#     应该在程序运行前就改正
# if 1>3
#     print("run...")


# 4.2 逻辑错误
# number01
age=input(">>: ").strip()
if age.isdigit():
    age=int(age)
    print(age > 10)
    

# number02
print(x)
# NameError: name 'x' is not defined


# number03
l=['a','b']
l[2]

# IndexError: list index out of range


# number04
class Foo:
    pass

Foo.y

# AttributeError: type object 'Foo' has no attribute 'y'

针对逻辑上的异常又分成两种处理方式

1.错误发生的条件是可以预知的,使用if判断来解决

age=input('>>: ').strip() # 输入的只要不是数字就会出错
if age.isdigit():
    age=int(age)
    if age > 18:
        print('猜大了')
    elif age < 18:
        print('猜大了')
    else:
        print('猜对了')
else:
    print('必须输入数字')

2.错误发生的条件是无法预知的

print('start...')
try:
    # 有可能会抛出异常的代码
    dic={
    
    'name':'wuchangwne'}
    dic['age']
    # 子代码1
    # 子代码2
    # 子代码3
except IndexError as e:
    print('异常的信息: ', e)
except NameError as e:
    print('异常的信息: ', e)

else:
    print('如果被检测的子代码块没有异常发生,则会执行else的子代码')
finally:
    print('无论被检测的子代码块有无异常发生,都会执行finally的子代码')


print('end...')

四、如何异常处理

异常处理的语法

'''


try:
    代码1
    代码2
    代码3
except 异常类型1 as e:
    处理异常的代码1
except 异常类型2 as e:
    处理异常的代码2
except (异常类型3,异常类型4,异常类型5) as e:
    处理异常的代码3
except Exception as e:
    处理异常的代码4
else:
    被监测的代码块没有发生异常时执行的代码
finally:
    无论被监测的代码块有无异常都会执行该代码

print('===>other code<====')
'''
# try不能单独和else连用,如果要用else,必须配合except
"""
try:
    print(111)
    print(222)
    print(3333)
except Exception:
    pass
else:
    print('ok')
print('===>other code<====')
"""

print('start...')

try:
    print('1111111111')
    print('2222222222')
    print('33333333')
    x
except Exception as e:  # 万能异常
    print('所有异常都可以匹配的到')
else:
    print('没有异常====>')

print('end....')

# 获取多个异常
try:
    print('start...')
    l=[]
    l[100]
    print('end...')
except KeyError as e:
    print("Key错误:",e)
except IndexError as e:
    print("索引错误:",e)
except Exception:
    pass
print('===>other code<====')
# finally可以单独与try配合使用
try:
    执行sql1
    执行sql2
    执行sql3
    执行sql4
    执行sql5
except Exception:
    执行回滚操作
else:
    执行提交操作
print('===>other code<====')

# try:
#     print(1111)
#     sadf
#     print(2222)
#     print(33333)
# finally:
#     print('====>finally')
#     # 回收资源

断言

'''
# 上半部分
print(111)
print(222)
print(333)
names=['egon','jack',]

# if len(names) != 3:
#     raise Exception("数据错误")
assert len(names) == 3

# 下半部分
print(names[2])
'''

raise主动抛出异常

class NameType(BaseException):
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return "<%s>" %self.msg

class People:
    def __init__(self,name):
        self.__name=name

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self,v):
        if not isinstance(v,str):
            raise NameType("名字必须是str类型")
        self.__name=v

    @name.deleter
    def name(self):
        del self.__name

obj=People('egon')
obj.name=123123
class Animal:
    def speak(self):
        raise Exception("必须定义speak方法")

    def run(self):
        raise Exception("必须定义run方法")


class Dog(Animal):
    pass

class People(Animal):
    pass


obj1=Dog()
obj2=People()


obj1.speak()
# obj1.run()

作者:吴常文
出处:https://blog.csdn.net/qq_41405475
本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

猜你喜欢

转载自blog.csdn.net/qq_41405475/article/details/114955304