美文网首页
19 异常处理[pyton基础]

19 异常处理[pyton基础]

作者: 乱弹琴给 | 来源:发表于2020-01-11 11:39 被阅读0次

异常概述

1,每个异常都是某个类的实例
2,发生了异常如果不捕获,则程序将终止执行
3,有一些内置的异常类
Exception:几乎所有的异常类都是从它派生而来的
AttributeError:引用属性或给它赋值失败时引发
OSError:操作系统不能执行指定的任务(如打开文件)时引发,有多个子类
IndexError:使用序列中不存在的索引时引发,为LookupError的子类
KeyError:使用映射中不存在的键时引发,为LookupError的子类
NameError:找不到名称(变量)时引发
SyntaxError:代码不正确时引发
TypeError:将内置操作或函数用于类型不正确的对象时引发
ValueError:将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适
ZeroDivisionError:在除法或求模运算的第二个参数为零时引发。

如何捕获异常

1,使用try...except 捕获所有异常或多个捕获的异常
def div(num1, num2):
rest = num1 / num2
print(rest)

if name = 'main':
try:
rest = test_div(5, 0)
print(rest)
except ZeroDivisionError:
print("报错了,除数不能为0")
except TypeError:
print("报错了,请输入数字")

except (ZeroDivisionError, TypeError):
     print("同类型错误处理")

except (ZeroDivisionError, TypeError) as e:
     print("报错了:"+ e)   //打印错误提示

except : //这样可以捕获全部异常
    print("报错了,请检查")

2,使用try...except...finally处理必不可少的逻辑

def test_finally():
try:
f = open('test.text', 'r')
rest = f.read()
print(rest)
int(rest) / 0
except ZeroDivisionError:
print('出错了')
finally:
f.close()
print('文件关闭了')

//如果在open('textdd.text', 'r')报错,比如文件名错了,其实没有打开文件,那后面的finally里的f.close()就会出错,这时候怎么处理?
def test_finally():
try:
f = open('test.text错误的文件名', 'r')
rest = f.read()
print(rest)
int(rest) / 0
except ZeroDivisionError:
print('出错了')
finally:
try //可以加一个异常捕获,或者是用if判断文件是否打开
f.close()
print('文件关闭了')
except:
pass

3,自定义异常

通过继承自Exception类来自定义异常
class MyException(Exception):
//自定义异常
pass

class ApiException(Exception):
//自定义的异常:在接口调用出错时触发,比如和第三方微信,支付宝等对接时,对方返回的异常。
pass

class ApiException(Exception):
//我的自定义异常
//定义类的成员变量
err_code = ''
err_msg = ''

def __init__(self, err_code=None, err_msg = None):
    //如果类有成员变量值,就使用自己的值,如果没有就使用传进来的值
    self.err_code = err_code if self.err_code else err_code
    self.err_msg = err_msg if self.err_msg else err_msg

def __str__(self):
    return 'Error: {0}-{1}'.format(self.err_code,self.err_msg)

class InvalidCtrlExec(ApiException):
//当参数不合法时触发
err_code = '40001'
err_msg = '不合法的调用凭证'

class BadPramsException(ApiException):
err_code = '40002'
err_msg = '两个参数必须都时整数'

def divide(num1, num2):
//触发的实现
//两个必须时整数
//用raise关键字触发异常
if not isinstance(num1, int) or not isinstance(num2, int):
raise BadPramsException()
//除数不能为0
if num2 == 0:
raise ApiException('400000', '除数不能为0')

return num1 / num2

if name == 'main':
try:
rest = divide(5, 0)
print(rest)

//下面两个类的顺序不要写反,要从小到大,先抓子类小,在抓大

except BadPramsException as e:
    print('---业务逻辑处理---')
    print(e)
except ApiException as err:
    print('出错了')
    print(err)

4,抛出异常和异常的传递
如果在异常产生的地方不捕获,那么它会一层一层的往上传递,直到被捕获为止,捕获以后不会继续往外抛了。

class MyException(Exception):
//自定义异常类
pass

def v_for():
//自定义函数
for i in range(1, 100):
if i == 20:
raise MyException
print(i)

def call_v_for():
//调用vfor函数
print('开始调用v_for')
try: //在这里捕获累哦执行全部结束语句
v_for
except MyException:
print('结束调用v_for')

def test_raise():
print('测试函数')
try: //在这里捕获执行不到上一层的 print('结束调用v_for')
call_v_for()
except MyException:
print('---------------------')
print('测试完毕')

if name == 'main':
test_raise()

相关文章

网友评论

      本文标题:19 异常处理[pyton基础]

      本文链接:https://www.haomeiwen.com/subject/azvvactx.html