异常
1,概念:程序出现不正常现象
java:异常和错误 Exception异常/Error错误 python:统称异常
2,常见异常类:
1)NameError:使用未定义变量
2)ZeroDivisionError:分母为零
3)SyntaxError:语法错误
4)IndexError:索引超出范围
5)KeyError:引用的字典键值错误
6)FileNotFoundError:找不到文件
7)AttributeError:类中没有属性
8)AssertionError:断言异常
9)IndentationError: expected an indented block:缩进错误
3,异常处理
try…except…else的语法:
try:
可能出现异常的代码
except:
捕获异常信息
else:
没有出现异常时调用
finally:
不管是否出现异常,总是运行 #一般执行关闭或者释放资源操作
else离不开except except可以没有else
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息)。
如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
例:
打开一个文件,在该文件中的内容写入内容,且并未发生异常:
try:
fh = open("d://testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print ("Error: 没有找到文件或读取文件失败")
else:
print( "内容写入文件成功")
fh.close()
内容写入文件成功
例:
打开一个文件,在该文件中的内容写入内容,但文件没有写入权限,发生了异常:
try:
fh = open("e://testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print( "Error: 没有找到文件或读取文件失败")
else:
print( "内容写入文件成功")
fh.close()
Error: 没有找到文件或读取文件失败
捕获异常:
当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python的异常捕获常用try…except…结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。此外,与python异常相关的关键字主要有:
异常中的finally:
str1 = 'hello world'
try:
int(str1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
else:
print('try内没有异常')
finally:
print('无论异常与否,都会执行我')
抛出异常 raise:
def fun(age):
if 0<age<130:
print("年龄是:",age)
else:
raise Exception("年龄过大")
fun(188)#数值在定义范围内则正常输出,否则触发异常
Traceback (most recent call last):
File "D:/python pr/py2001.py", line 1675, in <module>
fun(188)#数值在定义范围内则正常输出,否则触发异常
File "D:/python pr/py2001.py", line 1673, in fun
raise Exception("年龄过大")
Exception: 年龄过大
assert:断言
age = -1
assert 130 >= age >= 0,"年龄数值不合法"
Traceback (most recent call last):
File "D:/python pr/py2001.py", line 1690, in <module>
assert 130 >= age >= 0,"年龄数值不合法"
AssertionError: 年龄数值不合法
自定义异常
class AgeError(Exception):
def __init__(self,info):
self.info = info
def show(self):
print(self.info)
raise AgeError("年龄异常")
Traceback (most recent call last):
File "D:/python pr/py2001.py", line 1638, in <module>
raise AgeError("年龄异常")
__main__.AgeError: 年龄异常