【Day8】Python错误&异常

一、错误&异常

对比错误异常
产生场景编译时运行时
例如

语法错误SyntaxError(IndentationError缩进错误)

逻辑错误

名称错误NameError

零除错误ZeroDivisionError

处理

语法错误根据提示修正

逻辑错误不易发现,协助方式有调试器、加日志、编写测试用例、自定义异常、静态分析工具等

按需要,捕获异常

二、常见异常

异常产生原因例如
名称错误NameError未声明时

#未声明过变量a

print(a) #NameError

#未声明过函数b()

b() #NameError

零除错误ZeroDivisionError除数为0时

a = 1

b = 0

a/b   #ZeroDivisionError

类型错误TypeError非预期类型时

'we'+3

#TypeError,参与运算类型不匹配,字符串+字符串,或者数值+数值

def a():

        pass

a(23)  #TypeError,函数形实参数列表不匹配,调用方法也一样

class A:

        def a(self):

                pass

x = A()

x.a(123)  #TypeError,函数形实参数列表不匹配

t = (1,2)

t[1] = 5  #TypeError,不可变数据类型,修改时报类型错误

数值错误ValueError类型匹配,值非预期

int('werwe') 

#ValueError,int()方法入参字符串类型没问题,但是值应该是数值组成的字符串

索引错误IndexError索引越界

li = [1,2]

li[5]

#IndexError,li列表索引只有0,1,访问5不在可访问索引范围

键错误KeyError字典中不能存在该key

d = {'k1':v1,'k2':v2}

d['k4']

#KeyError,字典key中不存在k4

描述错误AttributeError引用实例没有声明该属性或方法

class A:

        pass

x = A()

x.a   #AttributeError,类A未声明属性a

x.run() #AttributeError,类A未声明方法run()

  1. TypeError&ValueError
    对比TypeErrorValueError
    例子'hello'+1int('hello')
    原因

    +运算符,用于拼接两个字符串,或者对两个数值做加法。

    当字符串在前,语法上‘+’后应该是字符串,但是为int类型,所以报类型错误。

    当数值在前时,语法上'+'后应该是数值,如果为字符串,也会报类型错误。

    另外,调用函数名存在,但实参与形参列表不匹配时,也会报类型错误。例如:

    def run():

         pass

    run(1,2,3)  #TypeError

    int()方法接收字符串类型实参没有问题,但是对值有要求,必须是数值组成的字符串。

    当接收了字母组成的字符串时,报值错误。

  2. NameError&TypeError&AttributeError
    对比NameErrorTypeErrorAttributeError
    例子

    class A:

          def a(self):

                 print(c)

    x = A()

    x.a()

    class A:

          def a(self):

                pass

    x = A()

    x.a(1)

    class A:

         pass

    x = A()

    x.a()

    原因类A有定义a()方法,但是a()方法中的c未声明过,报名称错误类A有定义a()方法,但是声明时形参只有一个对象自身,调用时有两个实参(对象自身+1),参数列表不匹配,报类型错误

    类A无方法a()

    变量x调用方法a(),报描述错误

三、异常处理

  1. 捕获异常语法格式
    '''
       捕获异常语法格式
    '''
    try:
        pass    # 可能出现异常的代码块
    except NameError:    # 指定一个错误类型,进行捕获
        pass    # 处理逻辑代码块
    except (ValueError,TypeError):    # 指定多个错误类型,作为元组进行捕获
        pass    # 处理逻辑代码块
    except:    # 捕获所有错误类型
        pass    # 处理逻辑代码块
    else:    # 无异常捕获时,执行分支
        pass    # 逻辑代码块
    finally:    # 最终执行分支,正常逻辑或者异常逻辑执行返回前
        pass    # 逻辑代码块
  2. 抛出异常语法格式
    '''
        抛出异常语法格式
    '''
    a = -1
    if a < 0:
        raise ValueError('不能为负数')

    【执行结果】

  3. 自定义异常
    '''
        自定义异常:需要继承Exception
    '''
    class My_Exception(Exception):
        def __init__(self,message):
            self.message = message
            print('自定义异常:',self.message)
    
    try:
        raise My_Exception('我的错') # 初始化自定义异常实例,并抛出
    except:    #捕获所有异常
        print('有错误抛出')
    finally:    #最后必然执行
        print('执行结束')

    【执行结果】

四、总结关键字

关键字功能例子
try跟可能出现异常的代码块

try:

    pass

except

不指明异常时,表示捕获所有异常;

指明异常时,表示捕获指定异常(指定多个时,用元组形式表示)

try:

    pass

except   A:

    pass

except  (A,B):

    pass

except:

    pass

else无异常时,执行该分支

try:

    pass   #无异常抛出

except:

    pass

else:

    pass

finally最终执行分支,无论正常或者异常,结束前必执行

try:

    pass

except:

    pass

else:

    pass

finally:

    pass

raise主动抛出异常raise 异常对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cy-doit

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

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

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

打赏作者

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

抵扣说明:

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

余额充值