异常

python的常见异常处理

异常: 在程序运行过程中影响程序正常运行的内容, 称为异常.

 print(a)
 NameError

 li=[1,2,3,4]
 print(li[4])
 IndexError:索引错误

 d=dict(a=1,b=2)
 print(d['c'])
 KeyError

print(10/(2-2))
ZeroDivisionError:除0错误

 class Student(object):
    def __init__(self,name,age):
       self.name=name
        self.age=age
    def echo(self):
        print(self.name,self.age)
 s1=Student('westos',10)
 print(s1.scores)
s1.echo()
 AttributeError:对象没有该属性

 with open('/tmp/passwd9') as f:
    print(f.read(5))
FileNotFoundError:没有该文件

tey-except语句

try:
     print(a)

如果出现NameError时,不报错,只显示except语句里面执行的内容.

 except NameError:
    print('name error')
    print('hello')
    print('hello1')

捕获异常

try:
    f=open('hello.txt','w')
    f.write('这是一个测试文件')

注意:except语句不一定会执行,只有在try语句中出现IOError报错时,才会执行

except IOError as e:
    print(e)
    print('没有找到文件或者文件读取失败')

如果没有捕获到异常,则执行else语句的内容

else:
    print('文件内容写入成功')

无论是否捕获到异常,都执行的语句

finally:
    f.close()
    print('文件已经关闭')

不指定异常类型的except语句

try:
    f=open('hello.txt')
    f.write('这是一个测试文件')
    f.read()
##不建议捕获所有的异常, 因能不能定位错误的位置.

except:
    print('捕获所有的异常')
else:
    print('如果没有捕获到异常,执行else语句')
finally:
    f.close()
    print('有无异常都会执行')
捕获多个异常

抛出异常和触发异常

raise:关键字,用来抛出异常,抛出异常的名称,抛出异常的详细显示

def get_age(age):
    if 0<age<=200:
        print(age)
    else:
        #如果raise抛出异常,程序后面的代码不会在执行
        raise Exception('invaild age')
get_age(100)
get_age(1000)

自定义异常类

所有的异常实际上是一个类,所以异常的父类都是BaseException

IOError,IndexError,KeyError,FileExistsError

class AgeError(BaseException):
    pass
def get_age(age):
    if 0<age<=200:
        print(age)
    else:
    # 如果raise抛出异常, 程序后面的代码不会再执行.
        raise AgeError('invaild age')
get_age(1000)
get_age(100)

抛出异常与继承

class B(Exception):
    pass
class C(B):
    pass
class D(C):
    pass
for cls in [B, C, D]:
    try:
        # 抛出异常
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值