点击跳转
《Python入门系列目录》
- 程序的错误
- 语法错误
- 运行时错误
- 逻辑错误
1. 用try语句处理异常
- 异常捕获可以使用try语句来实现,任何出现在try语句范围内的异常都会被及时捕获到
- try语句的两种常见形式
- try-except
- try-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 | 除数为0 |
SyntaxError | 语法错误 |
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))