Python异常
1、Python标准异常总结
AssertionError 断言语句(assert)失败
AttributeError 尝试访问未知的对象属性
EOFError 用户输入文件末尾标志EOF(Ctrl+d)
FloatingPointError 浮点计算错误
GeneratorExit generator.close()方法被调用的时候
ImportError 导入模块失败的时候
IndexError 索引超出序列的范围
KeyError 字典中查找一个不存在的关键字
KeyboardInterrupt 用户输入中断键(Ctrl+c)
MemoryError 内存溢出(可通过删除对象释放内存)
NameError 尝试访问一个不存在的变量
NotImplementedError 尚未实现的方法
OSError 操作系统产生的异常(例如打开一个不存在的文件)
OverflowError 数值运算超出最大限制
ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
RuntimeError 一般的运行时错误
StopIteration 迭代器没有更多的值
SyntaxError Python的语法错误
IndentationError 缩进错误
TabError Tab和空格混合使用
SystemError Python编译器系统错误
SystemExit Python编译器进程被关闭
TypeError 不同类型间的无效操作
UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
UnicodeError Unicode相关的错误(ValueError的子类)
UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
UnicodeTranslateError Unicode转换时的错误(UnicodeError的子类)
ValueError 传入无效的参数
ZeroDivisionError 除数为零
2、检测异常 try-except
1>用法:
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
>>> try:
f =open('我为什么是个文件.txt')
print(f.read())
f.close()
except OSError:
print('文件出错')
文件出错
>>> try:
f =open('我为什么是个文件.txt')
print(f.read())
f.close()
except OSError as reason:
print('文件出错\n错误的原因是: '+ str(reason))
文件出错
错误的原因是: [Errno 2] No such file or directory: '我为什么是个文件.txt'
>>> try:
sum = 1 + '1'
f =open('我为什么是个文件.txt')
print(f.read())
f.close()
except OSError as reason:
print('文件出错\n错误的原因是: '+ str(reason))
except TypeError as reason:
print('类型出错\n错误的原因是: ' + str(reason))
类型出错
错误的原因是: unsupported operand type(s) for +: 'int' and 'str'
2>捕获所有异常
>>> try:
int('abc')
sum = 1 + '1'
f = open('这是一个文件.txt')
print(f.read())
f.close()
except:
print('出错啦T_T')
出错啦T_T
>>> try:
sum = 1 + '1'
f = open('这是一个文件.txt')
print(f.read())
f.close()
except (OSError, TypeError):
print('出错啦T_T')
出错啦T_T
finally
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
finally:
无论如何都会被执行的代码
>>> try:
sum = 1 + '1'
f = open('这是一个文件.txt')
print(f.read())
f.close()
except (OSError, TypeError):
print('出错啦T_T')
finally:
print('出错也执行')
出错啦T_T
出错也执行
3>raise 引发异常
def mye( level ):
if level < 1:
raise Exception("Invalid level!")
# 触发异常后,后面的代码就不会再执行
try:
mye(0) # 触发异常
except Exception as err:
print(1,err)
else:
print(2)
>>> 1/0
Traceback (most recent call last):
File "<pyshell#1163>", line 1, in <module>
1/0
ZeroDivisionError: division by zero
>>> raise ZeroDivisionError
Traceback (most recent call last):
File "<pyshell#1164>", line 1, in <module>
raise ZeroDivisionError
ZeroDivisionError
>>> raise ZeroDivisionError("异常:除数为0")
Traceback (most recent call last):
File "<pyshell#1165>", line 1, in <module>
raise ZeroDivisionError("异常:除数为0")
ZeroDivisionError: 异常:除数为0
else
python中else除了可以跟if一起使用,还可以跟while,for配合,while顺利完成才执行else,如果被break中断则不执行else
def showMaxFactor(num):
count = num//2
while count >1:
if num % count == 0:
print('%d最大的约数是%d '% (num, count))
break
count -= 1
else:
print('%d是素数!' %num)
num = int(input('请输入一个数:'))
showMaxFactor(num)
else 和异常一起使用,try没有异常,才执行else
try:
print(int('abc'))
except ValueError as reason:
print('出错: '+ str(reason))
else:
print('没有异常')
出错: invalid literal for int() with base 10: 'abc'
with语句
with可以自动调用 f.close()
try:
with open('data.txt','w') as f:
for each_line in f:
print(each_line)
except OSError as reason:
print('出错啦:' + str(reason))
出错啦:[Errno 13] Permission denied: 'data.txt'
不然要手动关闭
try:
f = open('data.txt','w')
for each_line in f:
print(each_line)
except OSError as reason:
print('出错啦:' + str(reason))
finally:
f.close()
出错啦:[Errno 13] Permission denied: 'data.txt'
assert 断言
断言就是声明表达式的布尔值必须为真的判定,否则将触发 AssertionError 异常。
严格来讲,assert是调试手段,不宜使用在生产环境中,但这不影响我们用断言来实现一些特定功能,比如,输入参数的格式、类型验证等。
>>> def i_want_to_sleep(delay):
assert(isinstance(delay, (int,float))), '函数参数必须为整数或浮点数'
print('开始睡觉')
time.sleep(delay)
print('睡醒了')
>>> i_want_to_sleep(1.1)
开始睡觉
睡醒了
>>> i_want_to_sleep(2)
开始睡觉
睡醒了
>>> i_want_to_sleep('2')
Traceback (most recent call last):
File "<pyshell#247>", line 1, in <module>
i_want_to_sleep('2')
File "<pyshell#244>", line 2, in i_want_to_sleep
assert(isinstance(delay, (int,float))), '函数参数必须为整数或浮点数'
AssertionError: 函数参数必须为整数或浮点数