在Python或者C#开发中对于异常一般采用try—except,try—catch来捕获异常,然后发现对于异常类型不熟悉,和不自定义异常越来越不方便所以重新翻看基础后坐下记录。
1.raise语句
用于触发异常,通常碰到就头疼,类似于Throw。
注意最后一行,只表明了错误类型是异常的基类型并没有相关的错误信息,一般都会附加信息,一般后期的查错和修复,所以可以增加:
raise Exception('information of this exception')
这样红字中就会出现信息”information of this exception”,尽管看到红字就烦。
再一个简单的例子,除数不能为0:
def chufa(a,b):
if b==0:
raise ZeroDivisionError('plase check the second param')
else:
return a/b
一些常见的内建异常:
Exception #异常基类型
AttributeError #特性引用或者赋值失败
IOError #意图打开不存在的文件
IndexError #使用序列中不存在的索引
KeyError #使用映射中不存在的键
NameError #找不到名字\变量
SyntaxError #代码错误
TypeError #引用的类型
ValueError #对对象使用不正确的值
ZeroDivisionError #0作为除数
自定义异常:
class yourexception(Exception):
pass
当然你甚至可以为你的异常类型添加方法,尽管不知道有啥意义。
2.异常捕捉
Python中使用Try—–except来捕获异常
def(a,b):
try:
return a/b
except Exception as e:
print(e)
如果b等于0那么该函数调用时就会打印异常信息,except Exception会捕获所有的异常,如果只想捕获某一种异常比如这里只想要捕获过0异常就将Exception改成ZeroDivisionError就可以。
存在屏蔽的异常触发:
class Calculator:
muffled=True
def calc(self,expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print('illegal zero')
else:
raise
触发异常后悔根据自身的变量muffled
是否出发该异常。
捕捉多个异常:
try:
#your code
except (ZeroDivisionError,TypeError,ValueError) as e:
print(e)
#how to deal
要是什么异常都捕捉那就except Exception as e
就可以了e就是异常对象,可以根据不同的异常采取不同的操作
3.finally
如同其意,最后的操作,这个的好处就在于无论触发异常或者没有触发异常都会执行finally。
最常见的应用情景就是线程锁和进程锁,就算进程或线程执行过程中出现异常,也必须释放锁,否则整个程序就会被锁死在这里了。