python复习32~34异常处理

学习内容:异常处理

一些常见的python标准异常

异常名称解释
AssertionError断言语句(assert)失败:当assert关键字后边的条件为假时,程序将抛出该异常,一般用于在代码中置入检查点
AttributeError尝试访问未知的对象属性:当试图访问的对象属性不存在时抛出的异常
FloatingPointError浮点计算错误GeneratorExitGengeator.close()方法被调用的时候
ImportError导入模块失败的时候
IndexError索引超出序列的范围
KeyError字典中查找一个不存在的关键字
KeyboardError用户输入中断键(Ctrl+c)
MemoryError内存溢出(可通过删除对象释放内存)
NameError尝试访问一个不存在的变量
NotImplementedError尚未实现的方法OSError操作系统产生的异常(例如打开一个不存在的文件)
OverflowError数值运算超出最大限制
ReferenceError弱引用(weak reference)试图访问一个已经被垃圾回收几只回收了的对象
RuntimeError一般的运行时错误StopIteration迭代器没有更多的值
SyntaxErrorPython的语法错误
IndentationError缩进错误
TabErrorTab和空格混合使用
SystemErrorPython编译器系统错误
SystenExitPython编译器进程被关闭
TypeError不同类型间的无效操作
UnboundLocalError访问一个未初始化的本地变量(NameError的子类)
UnicodeErrorUnicode相关的错误(ValueError的子类)
UnicodeEncodeErrorUnicode编码时的错误(UnicodeError的子类)
UnicodeDecodeErrorUnicode解码时的错误(UnicodeError的子类)
UnicodeTranslateErrorUnicode转换时的错误(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:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值