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

    科技2024-02-22  111

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


    文章目录

    1. 用try语句处理异常1.1 try-except1.2 try-finally 2. 常见的异常处理3. 内置异常类4. 捕获异常的顺序5. 自定义异常类


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

    1. 用try语句处理异常

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

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

    3. 内置异常类

    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))
    Processed: 0.010, SQL: 8