python18-异常使用

4 异常

- 广义上的错误分为:错误和异常
- 错误:可以人为避免
- 异常:在语法逻辑上正确的前提下,出现的问题
- 在python里,异常是个类,可以处理和使用

4.1 异常的分类

  • AssertError 断言语句(assert)失败

  • AttributeError 尝试访问未知的对象属性

  • EOFError 用户输入文件末尾标志EOF(Ctrl+d)

  • FloatingPointError 浮点计算错误

  • GeneratorExit generator.close() 方法被调用的时候

  • ImportError 导入模块失败的时候

  • IndexError 索引超出序列的范围

  • KeyError 字典中查找一个不存在的关键字

  • KeyboardInterrupt 用户输入中断键(Ctrl+c)

  • MemoryError 内存溢出(可通过删除对象释放内存)

  • NameError 尝试访问一个不存在的变量

  • NotImplementedError 尚未实现的方法

  • OSError 操作系统产生的异常(例如打开一个不存在的文件)

  • OverflowError 数值运算超出最大限制

  • ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象

  • RuntimeError 一般的运行时错误

  • StopIteration 迭代器没有更多的值

  • SyntaxError Python的语法错误

  • IndentationError 缩进错误

  • TabError Tab和空格混合使用

  • SystemError Python编译器系统错误

  • SystemExit Python编译器进程被关闭

  • TypeError 不同类型间的无效操作

  • UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)

  • UnicodeError Unicode相关的错误(ValueError的子类)

  • UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)

  • UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)

  • UnicodeTranslateError Unicode转换时的错误(UnicodeError的子类)

  • ValueError 传入无效的参数

  • ZeroDivisionError 除数为零

      # IndexError l = [1,2] print(l[10])
      
      # AttributeError l = [1,2] print(l.nn)
      
      # ZeroDivisionError    l = [1,2] print(2/0)
    

4.2 异常的处理

不能保证程序永远正确运行
但是,必须保证程序在最坏的情况下可以妥善处理
python的异常处理模块全部语法:

  • try:
    • 尝试实现某个操作
    • 如果没出现异常,任务就可以完成
    • 如果出现异常,将异常从当前代码块扔出去尝试解决异常
  • except 异常类型1:
    解决方案1:用于尝试在此处处理异常解决问题
  • except 异常类型2:
    解决方案2:用于尝试在此处处理异常解决问题
  • except (异常类型1,异常类型2…)
    解决方案:针对多个异常使用相同的处理方式
  • except:
    解决方案:所有异常的解决方案
  • else:
    如果没有出现任何异常,将会执行此处代码
  • finally:
    管你有没有异常都要执行的代码
  • 流程
    1.执行try下的语句
    2.如果出现异常,在except语句里查找对应异常进行处理
    3.如果无异常,则执行else语句内容
    4.最后,不管是否出现异常,都要执行finally语句
    5.除except(最少一个)以外,else和finally都是可选的
#简单异常案例
#给出提示信息
try:
    num = int(input("input your number:"))
    result = 100/num
    print("计算结果是:{0}".format(result))
#捕获异常后,把异常实例化,出错信息会在实例里
#注意以下写法
#以下语句是捕获ZeroDivisionError  异常并实例化e

# 在处理异常的时候,一旦拦截到某一个异常,则不再继续往下查找,直接进行下一个
# 代码,即有finally则执行finally语句块,否则就执行下一个语句块

#如果是多种error的情况
#需要多种错误时,越具体越往前放

except ZeroDivisionError as e:
    print("输入的啥玩意...")
    print(e)
    #exit是退出程序的意思
    exit()
except NameError as e:    
    print("名起错了")
    print(e)
    
except AttributeError as a:
    print("好像属性有问题")
    print(e)

# 所有的异常都继承自Exception
# 如果写上下面这句话,任何异常都会被拦截
# 而且下面这句话,一定是最后一个except
except Exception as e:
    print("我也不知道哪出错了")
    print(e)
    
except ValueError as e:
    print("NO>>>>>>>>>>>>>>")
    
print("hhhhhh")
#作业: 为什么我们可以直接打印出实例e,此时实例e应该实现了哪个函数?

4.3 用户手动引发异常

  • 当某些情况,用户希望自己引发一个异常的时候,可以使用
  • raise关键字来引发异常
# raise案例
try:
    print("lalala")
    print(9527)
    # 手动引发一个异常 raise ErrorClassName
    raise ValueError
    print("......")
except NameError as e:
    print("NameError")
except ValueError as e:
    print("ValueError")
finally:
    print("Exit!")

lalala
9527
ValueError
Exit!

4.4 自定义异常

  • 只要是raise异常,则推荐自定义异常
  • 自定义异常的时候,通常包含
    • 自定义的异常的代码
    • 自定义发生异常后的问题提示
    • 自定义发生异常的行数
  • 最终的目的是,一旦发生异常,方便快速定位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值