首页 > 其他 > 详细

第七章 面向对象(14):异常处理:try...except

时间:2019-07-19 00:58:30      阅读:104      评论:0      收藏:0      [点我收藏+]

7.17 异常处理 try... except

什么是异常:异常是错误发生的信号,一旦程序出错,并且程序没有处理这个错误,那就会抛出异常,并且程序的运行随之终止

  • 错误分为两种:
    • 语法错误:在程序执行前就要立刻改正过来
    • 逻辑错误:
  • 对异常处理的方法:
    1. 错误发生的条件如果是可以预知的,此时应该用if判断去预防异常
    2. 错误发生的条件如果是不可预知的,此时应该用到异常处理机制:try...except

假设我们有个a.txt文件,我们来读取文件内容:

try:
    f = open('a.txt', 'r', encoding='utf-8')
    
    while True:
        print(next(f))  # f是迭代器类型,所以可以用next来访问
        
except StopIteration:  # 异常处理,这里指定异常的情况只能处理指定的异常
    print('出错啦')  # 可以定义异常情况的处理
    f.close()

异常处理详解

我们用代码例来说明异常处理的使用方法

  • python的异常信息会包括以下内容:
    • 追踪信息
    • 异常类型
    • 异常value
  • 异常的语法:
# 多分支:被检测的代码块抛出的异常有多种可能性,并且需要针对每一种异常类型都定制专门的处理逻辑
# 万能异常:Exception
# else 处理:else内的代码在没有异常的时候执行
# finally 处理:异常处理之后执行,即使发生了想定以外的异常,报错了,也依然会执行

# try...except 只会捕捉第一个发生的异常,并且不会执行try内部异常语句下面的语句

try:
    print('---1---')
    # name  # NameError,所以try内部的代码只能执行到这里
    print('---2---')
    li = [1,2,3]
    # li[100]  # IndexError
    print('---3---')

# 只能处理 except 指定的异常,其他异常依然会报错
except NameError as e:  # 把异常信息传给 e
    print('error:', e)  # 输出异常信息

# 如果要处理多种,可以再继续添加 except 语句。 
except IndexError as e:
    print('error:', e)
    
except Exception as e:  # 万能异常,这样可以处理其他异常
    print('error:', e)
    
else:  # else内的代码在没有异常的时候执行
    print('在没有发生异常的时候处理')

finally:  # 异常处理之后执行
    print('不管代码有无异常发生,都会执行')
  • 主动触发异常:raise 异常类型(值) - 面向对象
class People:
    def __init__(self, name, age):
        if not isinstance(name, str):
            raise TypeError('名字必须是str类型')  # 抛出异常
        if not isinstance(age, int):
            raise TypeError('年龄必须是int类型')  # 抛出异常
        
        self.name = name
        self.age = age

p1 = People('aaa', 12)
  • 断言 assert
info = {}
info['name'] = 'aaa'
info['age'] = 18

# if 'name' not in info:
#     raise KeyError('必须有name这个key')
# if 'age' not in info:
#     raise KeyError('必须有age这个key')

# python提供断言的功能 assert 。如果不满足条件就会抛出 AssertionError 异常
assert ('name' in info) and ('age' in info)  # 这一行就相当于上面的两个if语句

if info['name'] == 'aaa' and info['age'] > 10:
    print('Enter')
  • 自定义异常类型(类)

python默认带的异常类型都不能满足要求的时候,我们可以自定义异常类型

class MyException(BaseException):  # 大部分要沿用python提供的,所以继承BaseException
    def __init__(self, msg):
        super(MyException, self).__init__()
        self.msg = msg  # 输入给异常的参数
    
    def __str__(self):  # 异常的value 需要用__str__方法来输出
        return '<%s>' % self.msg
     
raise MyException('我自己的异常类型')
  • 什么时候用异常处理呢?
    • 错误发生条件可以预测
    • 错误一定会发生,我无法预知他发生的条件,可是我也必须完成功能

第七章 面向对象(14):异常处理:try...except

原文:https://www.cnblogs.com/py-xiaoqiang/p/11210491.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!