异常处理:获得原谅比获得许可更容易
try:
可能发生异常的代码
except:
异常处理代码
except:处理所有异常
except Type:处理指定类型的异常
except Type as data: 获取异常信息
except (Type|Type2|Type3):同时处理这三种异常,如果想获取异常数据,同样可以使用as语句
try:
opt = int(input('请输入一个整数'))
except (ValueError,KeyError):
print('error')
else:
print('没有发生异常')
定义下面这种方式捕捉异常时,一定要先写具体的异常,再写具有普遍性的异常,所有的异常,继承自Exception,最后再用Exception捕捉
try:
pass
except 异常类型1:
pass
except 异常类型2:
pass
except (异常类型3|异常类型4|异常类型5):
pass
except Exception as e:
print(e)
不管有没有发生异常都执行finally后的语句
可以只有try,finally语句
finally一般用来释放资源
try:
pass
except:
发生异常执行
else:
没有发生异常执行
finally:
不管有没有发生异常都执行
对一些普遍的异常进行处理,如果都不是最后用Exception捕捉,打印出来
try:
num=int(input('请输入整数'))
result=8/num
print(result)
except ValueError:
print('请输入一个整数')
except ZeroDivisionError:
print('除数不能为0')
except Exception as e:
print('未知错误%s'%e)
else:
print('执行正确')
finally:
print('执行结束')
异常的传递:异常发生后,会传递给方法(函数)的调用者A 有捕捉到该异常,则按捕捉机制处理
如果A没有捕捉该异常,则会层层向上传递
最终会传递给python解析器,此处就简单的终止程序
def fun1():
a=int(input('输入整数'))
print(10/a)
def fun2():
try:
fun1()
except ZeroDivisionError:
#fun1的异常会向上传递到fun2处,被fun2捕捉
print('除数为0')
fun2()
手动抛出异常 raise
def fun3():
print('hello')
raise ZeroDivisionError()
fun3()
自定义异常
class ParamInvalidException(Exception):
def __init__(self,code,msg):
self.code=code
self.msg=msg
def login(username,pwd):
if len(username)<6:
raise ParamInvalidException(2000,'用户名长度在6-9之间')
if username!='zhangsan':
raise ParamInvalidException(2001,'用户名错误')
print('登陆成功')
try:
login('lisi','123456')
print('后续操作')
except ParamInvalidException as e:
print(e.code)
程序发生异常了怎么办?
是否是可控的?不可控的话,不管他
可控的异常,进行处理
不管是否可控,都先记录一下
try:
pass
except Exception:
#先记录异常
#能处理就处理
#不能处理就raise