Python基础之异常处理

定义

程序执行的过程中,出现的错误称为异常

异常的捕获

将异常出现的错误,改为正常执行

注意

  • 异常具有传递性,在调用异常出现的所有函数中,都会报错
  • 异常的处理可以在异常传递的任意位置,最好处理异常的位置是最上层或者最下层,一般情况不在中间层处理,最上层进行捕获,定义一个异常类

常见异常

– 名称异常(NameError):变量未定义。
– 类型异常(TypeError):不同类型数据进行运算。
– 索引异常(IndexError):超出索引范围。
– 属性异常(AttributeError):对象没有对应名称的属性。
– 键异常(KeyError):没有对应名称的键。
– 未实现异常(NotImplementedError):尚未实现的方法。
raise NotlmplementedError
– 异常基类Exception。

异常处理

流程

try:
   	可能触发异常的语句
except 错误类型1 [as 变量1]:
    	处理语句1
except 错误类型2 [as 变量2]:
    	处理语句2
except Exception  [as 变量3]:
    	不是以上错误类型的处理语句
else:
    	未发生异常的语句
finally:
		无论是否发生异常的语句

自定义异常

1. 自定义异常的类的基类必须是Exception
2. 在__init__方法中必须添加super().__init__()

示例代码:

def apple(person_num):
    if isinstance(person_num, float):
        raise SelfFloatError(person_num)
    num = 100 // person_num
    num1 = 100 % person_num
    return num, num1


class SelfFloatError(Exception):
    def __init__(self, num):
        super().__init__()
        self.data = "参数不能是浮点性数据%f" % (num)

    def __str__(self):
        return self.data


class ErrorException(object):

    def __init__(self, function, *args):
        self.function = function
        self.args = args
        self.type = None
        self.error_str = None
        self.res = None

    def try_function(self):
        try:
            self.res = self.function(*self.args)
        except NameError as e:
            self.type = 1
            self.error_str = e
        except TypeError as e:
            self.type = 2
            self.error_str = e
        except ZeroDivisionError as e:
            self.type = 3
            self.error_str = e
        except SelfFloatError as e:
            self.type = 5
            self.error_str = e
        except Exception as e:
            self.type = 4
            self.error_str = e
        else:
            self.type = 0
            self.error_str = 'Success'
        finally:
            return self.type, self.error_str, self.res


if __name__ == '__main__':
    e = ErrorException(apple, 3.141592653)
    res = e.try_function()
    del e
    print(res)
    print(res[1].data)

运行结果:

(5, SelfFloatError(), None)
参数不能是浮点性数据3.141593

使用场景

  • 逻辑的角度来说: 程序执行存在问题
  • 设计的角度来说: 多层函数的返回

示例代码:

class SelfError1(Exception):
    def __init__(self, num):
        super().__init__()
        self.num = num


def a(n1, n2, n3, n4):
    n = n1 + n2
    return b(n1, n3, n4)


def b(n1, n2, n3):
    n = n2 - n3
    return c(n, n1)


def c(n1, n2):
    raise SelfError1(n1 * n2)


try:
    a(1, 2, 3, 4)
except SelfError1 as e:
    print(e.num)

运行结果:

-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写bug如流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值