• python学习第26天


    一.认识异常处理

    程序错误分为两种:语法错误 和 异常错误
    语法错误:代码没有按照python规定语法去写,发明创造产生的错误
    异常错误:在代码语法正确的前提下,程序报错就是异常

    try...except... 基础语法 用于解决程序异常问题
    raise 可以主动抛异常,异常类可以自定义

    1.异常的分类

    (1)IndexError 索引超出序列范围

    # lst = [1,2,3,4]
    # print(lst[100])
    

    (2)KeyError 字典中查找一个不存在的关键字

    # dic = {"a":1,"b":2}
    # print(dic["c"])
    

    (3)NameError 尝试访问一个不存在的变量

    print(abc)
    

    (4)IndentationError 缩进错误

    # if 5 == 5 :
       # print(1)
        # print(2)
    

    (5)AttributeError 尝试访问未知的对象属性

    # class MyClass():
       # a = 100
    # obj = MyClass()
    # obj.abc
    

    (6)StopIteration 迭代器没有更多的值

    # it = iter(range(3))
    # res = next(it)
    # res = next(it)
    # res = next(it)
    # res = next(it)
    

    (7)AssertionError 断言语句(assert) 失败 用于测试领域

    assert断言,就是猜,猜一猜后面的表达式是否正确

    如果猜对了,什么反应也没有,如果猜错了,直接报错

    if 判定时选择执行或者不执行, assert判定时选择报错或者不报错

    assert 3<4
    assert 3>4 # 报错
    
    if 3<4 :   
       pass
    

    2.异常处理的基本语法

    (1)基本语法

    try...except...

    把有问题的代码放到try这个代码块中

    如果出现了异常,直接执行except这个代码块

    作用:防止异常错误终止程序

    try:
       lst = [1,2,3,4]
       print(lst[100])
    except:
       pass
       # print("这里有异常错误")
    

    (2)带有分支条件的异常处理

    except + 异常错误类 特指在发生这类异常错误时,要执行的分支

    try:
       # IndexError
       # lst = [1,2,3,4]
       # print(lst[100])
       
       # KeyError
       # dic = {"a":1,"b":2}
       # dic["ccc"]
       
       # NameError
       print(abcdefg)
       
    except IndexError:
       print("索引超出了范围")
    except KeyError:
       print("字典的键不存在")
    except:
       print("有异常错误~")
    

    (3)处理迭代器的异常错误

    gen = mygen()
    
    # 通过try except 接收生成器函数中的返回值
    try:
       res = next(gen)
       res = next(gen)
       res = next(gen)
    except StopIteration as e:
       """
       StopIteration是异常错误类
       StopIteration as e 给StopIteration这个类的对象起一个别名叫做e
       __str__ 当打印对象时,自动触发该魔术方法,自动接收return的返回值
       """
       
       print("迭代器取值错误,越界了")
       print(e)
    

    (4) 异常处理的其他写法

    1)try...finally... 不论代码是否报错,把必须要执行的代码放到finally中

    try:
       lst = [1,2,3,4]
       print(lst[100])
    finally:
       print(2)
       print(3)
       print("end结束")
    
    print(666)
    print(888)
    
    1. try...except... else...

    如果try代码块没有报错,就执行else这个分支,如果有报错,就不执行else分支

    try:
       # print(1)
       lst = [1,2,3,4]
       print(lst[100])
    except:
       pass
    else:
       print("正常执行结束....")
    

    3)for / while ...else 如果遇到break异常终止了循环,则不会执行else这个代码块

    for i in range(10):
       print(i)
       if i == 5:
          break
    else:
       print("循环结束")
    

    3.主动抛异常(raise)

    raise + 异常错误类 or 异常错误类对象

    BaseException 是所有异常类的父类(基类,超类)

    Exception 是常规异常类的父类

    (1)基本语法

    try:
       # 主动抛出异常.
       raise BaseException
    except BaseException:
       pass
       
    # 简写 ( 默认接受的都是BaseException )
    try:
       raise
    except:
       print(11)
    

    (2)自定义异常类 MyException(务必继承父类BaseException)

    #(了解)系统底层获取行数和文件名的函数( 只有在程序异常时才能触发 ) 
    def return_errorinfo(n):
       import sys
       f = sys.exc_info()[2].tb_frame.f_back
       if n==1:      
          return str(f.f_lineno)      #返回当前行数
       elif n == 2:   
          return f.f_code.co_filename #返回文件名
    
    
    # 只有在抛出错误的时候,里面的行号和文件名才能获取到
    def get_value(n):
       try:
          raise
       except:
          return return_errorinfo(n)
    
    
    class MyException(BaseException):
       def __init__(self,num,msg,line,file):
          # 错误号
          self.num = num
          # 错误信息
          self.msg = msg
          # 错误行号
          self.line = line
          # 错误文件
          self.file = file
    
    
    sex = "雌雄同体"
    try:
       if sex == "雌雄同体":
          # raise + 异常错误类对象 => 主动抛异常
          raise MyException(404,"人类没有雌雄同体",get_value(1),get_value(2))
    
    # 给MyException的类对象起别名叫做e
    except MyException as e:
       # 对象.属性 
       print(e.num) # 404
       print(e.msg) # 人类没有雌雄同体
       print(e.line)# 59
       print(e.file)# E:/python30/day26/3.py
    
  • 相关阅读:
    【编程题目】左旋转字符串 ☆
    360測试开发笔试题(2016内推)
    start_kernel——boot_cpu_init及PER_CPU
    UVa 10673
    【面试】-Java基础知识
    Navgationcontroller 的pop
    别拿接口不当开发
    C++基础学习教程(三)
    安卓版微信自带浏览器和IE6浏览器ajax请求abort错误处理
    【动态树问题】LCT学习笔记
  • 原文地址:https://www.cnblogs.com/yunchao-520/p/13039660.html
Copyright © 2020-2023  润新知