错误与异常的处理

产生错误和异常

用文件的读取举例,在用r模式打开文件的时候,如果文件不存在,程序就会报错,说明此时出现了问题。
在这里插入图片描述
可以看出,第一行打印正常输出,而第二行却没有,错误提示说FileNotFoundError没有找到文件名。

捕获异常

对可能发生问题的地方,可以通过捕获异常来保证程序不中断。

使用方法:

try:
可能出现问题的代码
except 错误类型:
出现错误后执行的代码
还是用打开文件举例
在这里插入图片描述
第一行打印正确输出,而用r打开一个不存在的文件会出错,就像上一次执行的结果。而现在程序没有报错,因为捕获到了异常执行了except中的内容。pass表示一个占位符,什么都不做所以才只有第一行输出。

不同的异常类型

找不到文件名属于输入输出异常,使用IOError
而错误有很多,不一定都是IOError
在这里插入图片描述
如图所示,如果错误是因为变量没有定义而产生的,再使用IOError异常类型还是会出错,并且显示NameError。因为他只能捕获输入输出异常,名称错误捕获不到。
在这里插入图片描述
当改成了对应的异常类型之后就可以正常捕获了。

可能同时存在多种异常类型

在一段代码中,可能会存在多种不同的异常类型,没办法用某一种概括时,可以将所有可能出现的异常类型写在一起。
在这里插入图片描述
图中显示的代码存在两种异常,一种是因为用r模式打开没有定义的文件,另一种是没有定义num。
而在真正的执行过程中,会因为在打开文件时就出现了异常而直接进行捕获,之后的内容不再继续执行,可以通过打印异常信息进行查看。

打印异常信息

在捕获异常的时候,后边加上as通过变量打印输出异常信息。
在这里插入图片描述
可以看这时的错误是因为找不到123.txt文件,而当修改内容为打开一个已有的文件时:
在这里插入图片描述
上边的代码正常打印输出,而到打印num的时候还是会出现错误,错误类型是num没有定义。

一次捕获所有异常

由于异常类型很多,可以用Exception概括。
在这里插入图片描述

try…finally和嵌套

try和finally可以一起使用,不管try中有没有异常,finally中的内容都会执行。
在这里插入图片描述
此时的test1文件中没有内容,按照正常的话,break之后后跳出,后边的内容都不会在执行,而finally中的内容还是打印出来了。
try中可以嵌套try。

练习:写文件和复制文件

1.应用文件操作的相关知识,通过Python新建一个文件gushi.txt,选择一首古诗写入文件中
2.另外写一个函数,读取指定文件gushi.txt,将内容复制到copy.txt中,并在控制台输出“复制完毕”。
3.提示:分别定义两个函数,完成读文件和写文件的操作。
尽可能完善代码,添加异常处理。

def writefile():
    try:
        w = open("gushi.txt", "w",encoding="utf-8")  #加上encoding防止出现乱码
        w.write("静夜思--李白")
        w.close()
    except Exception:
        print("写文件出现了错误")
def copy(content):
    try:
        c = open("copy.txt","w",encoding="utf-8")
        c.write(content)
        c.close()
    except Exception:
        print("复制的时候出现错误")
def readfile():
    try:
        r = open("gushi.txt","r",encoding="utf-8")
        content = r.read()
        if len(content) == 0:
            print("文件中没有内容")
        else:
            copy(content)
            print("复制完毕")
        r.close()
    except Exception:
        print("读文件发生了错误")
writefile()
readfile()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值