1、语法错误和异常
语法错误是在代码执行前可以检测的,由于不符合代码语法规范引起的
异常指程序运行过程中导致的超出预期处理能力的情况
常见的异常:
0作为除数
未定义的对象被直接使用,比如参与运算或者调用其属性和方法
str类型直接和非str类型相加
输入输出与系统异常等
异常有两种处理方式:直接捕获进行处理,将其抛出由上级(调用异常代码)进行处理
2、捕获
(1)完整结构
try:
执行代码
except:
发生异常时执行的代码
else:
没有异常时执行的代码
finally:
无论是否发生异常时执行的代码
else和finally结构是可以省略的
finally结构实际可以考虑直接放在外部,这里主要是为了逻辑阐述的强迫性,保持功能的完整
一般关闭资源之类的操作会习惯放在finally在
(2)except
try:
pass
except OSError as err
print("OS error: {0}".format(err))
except ValueError:
pass
except (RuntimeError, TypeError, NameError):
pass
except:
pass
try后可以跟多个except结构,从上到下匹配,匹配到后即执行,不再匹配其它except结构,而是考虑except之和else或者finally结构
一般将描述越详细的异常类型放在前面,将描述越宽广的类型放在后面
如果except后没有跟异常类型,表示匹配所有异常类型,一般放在except的末尾
except … as …结构为异常取一个别名,一般是考虑到异常类型会比较详细显得冗长,起一个简短的别名,方便在except内部使用
如果多个异常的处理方法一致,可以在一个except后添加一个元组,在元组中声明并列的多个异常类型
3、抛出
使用关键字raise,其后跟一个Exception的对象或者其类型的子类型的对象,完成抛出
if x > 5:
raise Exception('这里发生了异常,x>5')
一个方法中存在抛出异常的行为,则调用该方法的代码需要进行捕获,捕获的类型为抛出时创建的异常类型
4、自定义异常
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
一般自定义异常,就是创建一个能够显示异常类型的类名的类,不需要做其它操作
其作用就是记录异常类型和异常信息,在传递过程中方便被调用查看