python异常处理
Python异常处理
try...except...else语法
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字> as <数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
try
的工作原理是,当开始一个try
语句后,python
就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么会根据try
执行的子句内容和excep
t语句,出现三种不同的流程:
try
子句执行过程中出现异常,且下面的except
中有匹配的异常类型,则会执行匹配到的except
字句,然后通过整个try
流程(就是else
后的内容不会执行)try
子句执行过程中出现异常,但是下面的except
中吗,没有匹配的异常类型,此时异常会被递交到上层的try
流程,或者程序的最上层(此时会结束程序并打印出默认的错误信息)try
子句执行过程中没有发生异常,则会执行else
语句,然后通过真个try
流程
except
后面可以接一个或者多个异常名;或者不接任何内容表示捕获所有异常:
except IOError:
except (IOError, ValueError):
except:
except ValueError as Argument: # Argument用于将异常作为一个变量打印出来
def temp_convert(var):
try:
return int(var)
except ValueError as argument:
print ("参数没有包含数字\n", argument)
# 调用函数
temp_convert("xyz")
# 执行结果
"""
参数没有包含数字
invalid literal for int() with base 10: 'xyz'
"""
try...finally语句
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
raise Exception
finally:
print ("Error: 没有找到文件或读取文件失败")
"""
Error: 没有找到文件或读取文件失败
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
c:\Users\zhang'lei\Desktop\课题3.18\第十三次汇报\test.ipynb Cell 8' in <cell line: 1>()
2 fh = open("testfile", "w")
3 fh.write("这是一个测试文件,用于测试异常!!")
----> 4 raise Exception
5 finally:
6 print ("Error: 没有找到文件或读取文件失败")
Exception:
"""
finally
语句内容,是当退出整个try
流程时会运行的语句,比如上面的输出的流程是:
try
语句中遇到了一个Exception
异常,会找该try
流程中的except
语句,没有找到,此时会退出整个try
流程,因此执行finally
语句,然后找上级try
语句,也没找到,此时异常会被递交到最上层,终止程序打印错误
try...except...else...finally语句
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
# raise Exception
except IOError:
print('出现读写错误')
else:
print('写入成功')
finally:
print ("我要退出这个try流程了")
"""
写入成功
我要退出这个try流程了
"""
else可以和finally同时执行,但是except语句不能和else同时执行
rais
可以用于主动触发异常
rais
后面接上异常名称即可,或者自己传入参数,相当于实例化一个异常对象,Exception
是常规错误基类
raise Exception(字符串或者对象实例)
def mye( level ):
if level < 1:
raise Exception("Invalid level!")
# 触发异常后,后面的代码就不会再执行
try:
mye(0) # 触发异常
except Exception as err:
print (1,err)
else:
print (2)
"""
1 Invalid level!
"""
用户自定义异常
通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是通过直接或间接的方式继承自BaseException
类(所有异常的基类)。以下为与Exception
常规错误基类相关的例子,其中创建了一个类,继承自Exception
class Networkerror(Exception):
def __init__(self,ErrorInfo):
super().__init__(self) # 初始化父类
self.errorinfo=ErrorInfo
def __str__(self):
return self.errorinfo # 打印该异常时就相当于打印self.errorinfo
try:
raise Networkerror("Bad hostname")
except Networkerror as e:
print (e.errorinfo)
"""
Bad hostname
"""
assert断言语句
assert
后面接一个表达式,如果表达式为真则执行后面的代码,否则触发名为AssertionError
异常
assert expression, 参数 # 也可以不跟参数
# 等价于
if not excepression:
rais AssertionError(参数)
assert 1==2, '1不等于2'
"""
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
c:\Users\zhang'lei\Desktop\课题3.18\第十三次汇报\test.ipynb Cell 11' in <cell line: 1>()
----> 1 assert 1==2, '1不等于2'
AssertionError: 1不等于2
"""