学习内容:异常处理
一些常见的python标准异常
异常名称 | 解释 |
---|---|
AssertionError | 断言语句(assert)失败:当assert关键字后边的条件为假时,程序将抛出该异常,一般用于在代码中置入检查点 |
AttributeError | 尝试访问未知的对象属性:当试图访问的对象属性不存在时抛出的异常 |
FloatingPointError | 浮点计算错误GeneratorExitGengeator.close()方法被调用的时候 |
ImportError | 导入模块失败的时候 |
IndexError | 索引超出序列的范围 |
KeyError | 字典中查找一个不存在的关键字 |
KeyboardError | 用户输入中断键(Ctrl+c) |
MemoryError | 内存溢出(可通过删除对象释放内存) |
NameError | 尝试访问一个不存在的变量 |
NotImplementedError | 尚未实现的方法OSError操作系统产生的异常(例如打开一个不存在的文件) |
OverflowError | 数值运算超出最大限制 |
ReferenceError | 弱引用(weak reference)试图访问一个已经被垃圾回收几只回收了的对象 |
RuntimeError | 一般的运行时错误StopIteration迭代器没有更多的值 |
SyntaxError | Python的语法错误 |
IndentationError | 缩进错误 |
TabError | Tab和空格混合使用 |
SystemError | Python编译器系统错误 |
SystenExit | Python编译器进程被关闭 |
TypeError | 不同类型间的无效操作 |
UnboundLocalError | 访问一个未初始化的本地变量(NameError的子类) |
UnicodeError | Unicode相关的错误(ValueError的子类) |
UnicodeEncodeError | Unicode编码时的错误(UnicodeError的子类) |
UnicodeDecodeError | Unicode解码时的错误(UnicodeError的子类) |
UnicodeTranslateError | Unicode转换时的错误(UnicodeError的子类) |
ValueError | 传入无效的参数ZeroDivisionError除数为零 |
一些错误的实例:
>>> list1=[1,2,4,5,,]#语法错误
SyntaxError: invalid syntax
>>> list = [1,2,3]
>>> print(list[len(list)])
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
print(list[len(list)])
IndexError: list index out of range
>>> #索引超出列表范围
>>> list1=[1,3,6,5]
>>> list1.sorted()#尝试访问未知的对象属性
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
list1.sorted()#尝试访问未知的对象属性
AttributeError: 'list' object has no attribute 'sorted'
>>> def f(x,y):
print(x,y)
>>> f(x=1,2)
SyntaxError: positional argument follows keyword argument
>>> #要么均为关键字参数x=1,y=2,要么关键字参数必须在位置参数之后即1,y=2
>>> def f1():
x=5
def f2():
x*=x
return x
return f2()
>>> f1
<function f1 at 0x000001DC261DEE50>
>>> f1()
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
f1()
File "<pyshell#31>", line 6, in f1
return f2()
File "<pyshell#31>", line 4, in f2
x*=x
UnboundLocalError: local variable 'x' referenced before assignment
>>> #python在认为x是局部变量时,外部函数的局部变量就被屏蔽起来,所以x*=x根本找不到局部变量x的值,一次报错
>>> def f1():
x=[5]
def f2():
x[0]*=x[0]
return x[0]
return f2()#可以这样将x存放在容器(字符串,列表,元祖)里,而不是放在栈里,所以不会被屏蔽掉
>>> f1()
25
>>> def f1():
x=5
def f2():
nonlocal x#或者使用nolocal
x*=x
return x
return f2()
>>> f1()
25
检测异常:
使用trt…except捕获出现的异常:
try:
检测范围
except Exception[as reason]:
输出异常的处理代码
异常题意处理:
>>> try:
int('abc')
sum = 2+'a'
f=open('不存在的文档.txt')
print(f.read())
f.close()
except(OSError,TypeError,ValueError)as reason:
print('程序出错了\n错误的原因是:'+str(reason))
程序出错了
错误的原因是:invalid literal for int() with base 10: 'abc'
如果要保证无论是否出现异常都执行文件关闭的命令,用finally语句:
>>> try:
f=open('D:\\carrot1.txt')
print(f.read())
sum=1+'5'
except:
print('出错了')
finally:
f.close()
今天天气还不错
好啊,去哪里玩呢?
要不外面去私人影院吧
出错了
但这里如果文件不存在,关闭文件时还是会出现错误,修正:
>>> try:
f=open('D:\\不存在.txt')
print(f.read())
sum=1+'5'
except:
print('出错了')
finally:
if 'f' in locals():#如果文件对象变量存在当前局部变量符号表的话,说明打开成功
f.close()
下面利用异常处理编写一个函数:当用户输入整数时正常返回:
def int_input(p=''):
while True:
try:
int(input(p))
break#结果为True则结束循环
except ValueError:
print('出错,您输入的不是整数')
int_input('请输入一个整数')
else语句和with 语句搭配:
使用with语句,避免文件打开后忘记关闭
>>> try:
with open('D:\\carrot1','rt')as f:
for eachline in f:
print(eachline)
except OSError as reason:
print('出错啦:'+str(reason))
出错啦:[Errno 2] No such file or directory: 'D:\\carrot1'
可以将:
f1=open(file1)
f2=open(file2)
......
f1.close()
f2.close()
修改为:
with open(file1) as f1,open(file2) as f2: