Python入门(二十八):异常处理

点击跳转
《Python入门系列目录》



  • 程序的错误
    • 语法错误
    • 运行时错误
    • 逻辑错误

1. 用try语句处理异常

  • 异常捕获可以使用try语句来实现,任何出现在try语句范围内的异常都会被及时捕获到
  • try语句的两种常见形式
    • try-except
    • try-finally
  • try块必须与except或finally块一起使用

image

1.1 try-except

  • 执行方式如下

    • 尝试执行try语句内可能出现问题的代码
    • 如果发现确实出现了我们所写的异常,则执行except部分的处理代码,然后正常执行后面的代码
    • 否则直接执行try语句中的代码段,然后正常执行后面的代码
    try:
        # 文件名为file1.txt,此处写成file.txt
        f = open("F:/file.txt", 'r')
    except FileNotFoundError:
        print('文件找不到!!')  # 文件找不到!!
    
    try:
        # 文件存在
        f = open("file1.txt", 'r')
        print(a)
    except FileNotFoundError:
        print("文件找不到!")
    except NameError:
        print("变量未定义!")  # 执行了这一条
    
  • 若无法确定要对哪一类异常做处理时,也可以写成如下形式

    ...
    except:
        print("出错了!")
    ...
    
  • 处理除数有0的异常

    try:
        s = input("请输入一个数学表达式:")
        print(eval(s))
    except ZeroDivisionError:
        print("除数不可以为0!")
    

1.2 try-finally

  • 执行方式如下

    • 尝试执行try语句内可能出现问题的代码
    • 如果发现确实出现了我们所写的异常,则执行except部分的处理代码,然后必须执行finally部分的代码,再去执行后面其他的代码
    • 如果没有发现异常,则直接执行try语句中的代码段,跳过except部分,但仍要执行finally部分的代码,再去执行后面其他的代码
    • 一个try块后最多只能接一个finally块
    try:
        f = open("result.txt", 'r')  # 文件存在
        print(a)
    except NameError:
        print("变量未定义!")
    finally:
        f.close()
    
  • 对于try-finally模型来说,except语句部分是可有可无的,如果不写except语句部分,则如果发生异常,会输出Traceback信息,然后执行finally部分的语句

    try:
        f = open("result.txt",'r')
        print(a)
    finally:
        f.close()
    

2. 常见的异常处理

异常描述
NameError尝试访问一个不存在的变量
ZeroDivisionError除数为0
SyntaxError语法错误
IndexError索引超出序列范围
KeyError请求一个不存在的字典关键字
OSError操作系统产生的错误,就像打开一个不存在的文件会引发FileNotFoundError,它是OSError的子类
AttributeError尝试访问未知的对象属性
TypeError不同类型间的无效操作,比如:1 + ‘1’

3. 内置异常类

image

4. 捕获异常的顺序

  • except块可以捕获并处理特定的异常类型(此类型称为“异常筛选器”),具有不同异常筛选器的多个except块可以串联在一起
a = (44, 78, 90, -80, 55)
total = 0
try:
    for i in a:
        if i < 0:
            raise ValueError(str(i) + "为负数")    # 自定义抛出异常
        total += i
    print('合计=', total)
except Exception:       # 出现此异常。该异常是父类,且按except顺序捕获
    print('发生异常')
except ValueError:
    print('数值不能为负')

5. 自定义异常类

  • 自定义异常类一般继承于Exception或其子类
  • 自定义异常类的命名规则一般以Error或Exception为后缀
class NumberError(Exception):  # 自定义异常类,继承于Exception
    def __init__(self, data):
        Exception.__init__(self, data)
        self.data = data

    def __str__(self):  # 重载str方法
        return self.data + ':非法数值(<0)'


def total(data):
    total = 0
    for i in data:
        if i < 0:
            raise NumberError(str(i))
        total += i
    return total


# 测试代码
data1 = (44, 78, 90, 80, 55)
print('总计=', total(data1))
data2 = (44, 78, 90, -80, 55)
print('总计=', total(data2))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值