zoukankan      html  css  js  c++  java
  • Python基础语法 第9节课(异常处理)

    异常处理

    一、捕获异常

    1.背景:即程序出现了意想不到的情况,bug,如果异常不解决,程序会崩溃,停止运行

    lst = ['hello']
    #此处有很多行代码
    print(lst[9])#异常,取不到索引为9的数据
    print('running')#后面的代码都无法再正常运行
    .
    .
    .

    最基础的异常捕获

    2.异常捕获(捕获异常)

    如果出现异常,我们会让它按照事先规定的规则去执行对应的操作,记录错误日志:log

    语法:

    try(要运行有可能出现异常的代码):

      要运行的代码

    except(异常):

      出现异常的时候要运行的代码(执行的操作),记录日志

    注:1.try的语句会执行,不然就不会报错了。

      2.一旦try里面的代码报错,立即跳到except,try报错代码的下面的剩余语句将不会执行

    lst = ['hello']
    try:
        print(lst[9])
    except:
        print('记录错误日志')
    print('running....')
    print('finish')
    '''
    记录错误日志
    running....
    finish
    '''

      3.如果try里面的代码没有出现异常,就不会执行except

    lst = ['hello']
    try:
        print(lst[0])
        print('python-lemon')#try里面没有异常,都会执行完,不会进入except
    except:
        print('记录错误日志')
    print('running....')
    
    '''
    hello
    python-lemon
    running....
    '''

    3.try......except Exception as err......

    好的程序员:知道什么代码需要放到try里面

    #需不需要加异常??
    a = 4
    b = 2
    print(a*b)

    a,b是变量,事先不知道是什么数据类型,就需要加异常,否则如果输入的是字符串,列表啥的,就会报错;如果事先知道就是int/float,就不需要加异常

    a = '4'
    b = 'q'
    try:
        print(a*b)
    except:
        print('参数错误,记录日志')

    上面的try.....except....捕获了异常,但是不知道到底是哪里出了bug.下面用:except Exception as err.会把错误类型赋值给err

    a = 4
    b = 0
    try:
        print(a/b)
    except Exception as err:
        print('出现了异常:{}'.format(err))
    #结果:出现了异常:division by zero

    在实际操作中,最好用这个方法(try......except Exception as err......)。

    4.异常捕获的进阶:指明出现的异常类型

    先不要加异常,让它报错(开发主动报错),将报错的类型记住,去异常捕获的时候,加入except语句中

    语法:

    try:

      代码

    except 错误类型 as err:

      print('异常{}'.format(err))

    finally:-------------------→不管有没有报错,finally里面的代码都会执行。

      print('hello word')

    lst = ['hello']
    a = 4
    b = 0
    try:
        print(a/b)
        print(lst[2])
    except IndexError as err:
        print('出现了异常:{}'.format(err))
    except ZeroDivisionError as err:
        print('出现除法异常:{}'.format(err))
    finally:
        print('hello wold')
    
    #结果:
    '''
    出现除法异常:division by zero
    出现除法异常:division by zero
    hello wold
    '''

    二、手动抛出异常raise

    raise手动抛出异常,让程序终止运行

    def join_team(age,gender):
        if age > 22:
            raise ValueError('年龄要小于22')
        print('可以加入team')
    
    print(join_team(23,'girl'))
    '''
        raise ValueError('年龄要小于22')
    ValueError: 年龄要小于22
    
    '''

    错误类型介绍

    ImportError:无法引入模块或包
    IndexError:下标索引超出序列边界
    NameError:使用一个还未赋予对象的变量
    SyntaxError:代码逻辑语法错误,不能执行,不能捕获
    TypeError:传入的对象类型与要求不符合
    ValueError:传入一个不被期望的值,即使类型正确
    KeyError:试图访问你字典里不存在的key
    IOError:输入输出异常,文件按操作

    1.SyntaxError --------语法错误不能被捕获

    try:
        ldljsdjlg'khkhkh'
    except:
        print('语法错误')
    #结果显示错误,不能捕获异常
    '''
        ldljsdjlg'khkhkh'
                        ^
    SyntaxError: invalid syntax
    '''

    2.KeyError

    dict1 = {'1':'one','2':'two'}
    print(dict1['3'])
    '''
        print(dict1['3'])
    KeyError: '3'
    '''

    3.IndexError

    lst2 = [1,5,[8,9],'hello']
    print(lst2[5])
    '''
        print(lst2[5])
    IndexError: list index out of range
    '''

    4.ValueError

    a  = 4
    print(int('a'))
    '''
        print(int('a'))
    ValueError: invalid literal for int() with base 10: 'a'
    '''

    三、异常分组

    好处:如果你们发现了一个验证级别为阻塞级别的bug,短信通知开发人员马上集合解决问题

    如果不同的错误类型,异常处理的行为是一样的(短信通知),组合起来,可以简化代码。

    try:
        1 / 0
        ['hello'][3]
        {'name':'pyrhon'}['age']
    except (IndexError,KeyError) as  e:
        '短信通知这里出现很严重的问题'
        print('可以捕获IndexError和KeyError')
    except ZeroDivisionError as e:
        '记录日志'
        print('除法出现异常{}'.format(e))

    最好不要直接用Exception,因为自己都不知道报什么错!------------最好避免!

    try:
        1/0
    except Exception as e:
        print('其他类型的异常')

    四、了解即可

    try:

      .....

    except :

      .......

    else:

      ........

      

  • 相关阅读:
    软件包的作用
    Sqlserver2008 表分区教程
    C#通用类型转换 Convert.ChangeType
    缓存 HttpContext.Current.Cache和HttpRuntime.Cache的区别
    用户信息 Froms验证票证
    .NET4.0 __doPostBack未定义
    TFS2012 安装 配置笔记
    MVC学习笔记一
    新博客..第一天..
    ORACLE多表查询优化
  • 原文地址:https://www.cnblogs.com/ananmy/p/12873472.html
Copyright © 2011-2022 走看看