zoukankan      html  css  js  c++  java
  • Python之异常处理

    Python 异常处理

    1.捕获异常  (作用:程序运行过程中,可能会出现意想不到的异常,如果异常未被解决,程序会崩溃,停止运行)

    #例如,以下例子
    a='name'
    print(a[10])  #报错:IndexError: string index out of range
    print('今天是个好天气')  #报错后面的程序将不会执行

    所以,异常处理就显得很有必要

    捕获异常的基础语法:

    1.处理异常定义,如果出现异常,我们会让它按照事先规定的规则去执行对应的操作,从而记录报错的log日

    2.语法:

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

      (缩进)存放可能出现报错的代码模块

    except(异常):

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

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

    try:
        a = 'name'
        print(a[10])
        print('今天是个好天气')
    
    except:
        print('try模块存在报错,后续程序不能被执行')
    
    输出结果:
    try模块存在报错,后续程序不能被执行

    3.如果try模块下的代码没有出现异常,则正常执行,不会执行except模块下的代码

    try:
        a = 'name'
        print(a[2])
        print('今天是个好天气')
    
    except:
        print('try模块存在报错,后续程序不能被执行')
    
    输出结果:
    m
    今天是个好天气

    4.一般,在写异常处理模块时,都要预先考虑到,可能会出现报错的地方,然后将其放到try里面,从而防止报错影响程序的整体执行

    #前期预判
    a = 'name'
    print(a[2])   #a变量是一个字符串,根据索引值取字符串的值,所以可能存在索引值超出字符串的长度的报错
    print('今天是个好天气')
    
    #案例二
    b=12
    c=23
    print(b*c)
    
    #b和c都是变量,如果给予b和c赋予的数据类型非int和float类型,那就会报数据类型的错误,所以此处就需要加  异常处理

    5.使用try......except......语句捕获了异常,但是不清楚是哪里出现问题,是数据类型错误、超出范围错误还是其他的错误等等

    面对以上的问题,可以使用 except  Exception as err:将错误类型赋值给err  ,打印出来

    try:
        a = 'name'
        print(a[20])
        print('今天是个好天气')
    
    except Exception as err:
        print('try模块存在报错{},后续程序不能被执行'.format(err))
    
    输出结果:
    try模块存在报错string index out of range,后续程序不能被执行

    注意:工作当中,最好用以上的方法捕获异常,这样就可以很直观的看到报错的内容,也好定位问题

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

    方法:先不加异常,执行代码,查看程序可能出现的报错类型,然后将报错的类型加入except 语句中就行

    语法:

    try:

      (缩进)执行的代码模块

    except  报错类型  as  err:

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

    finally:    ---------------->该模块属于,不管有没有报错,里面的代码都会被执行

        (缩进)  print('你好世界')

    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
    '''

    7.手动抛出异常 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
    
    '''

    8.错误类型介绍(以下错误类型,可以接下来了解使用)

    ImportError :无法引入模块或包

    IndexError:下标索引超出序列边界

    NameError:使用一个还未赋予对象的变量

    TypeError:传入的对象类型与要求不符合

    SyntaxError:代码逻辑语法错误,不能执行,不能捕获

    ValueError:传入一个不被期望的值,即使类型不正确

    KeyError:试图访问你字典里不存在的key

    IOError:输入输出异常,文件操作

    9.异常分组

    好处:如果我们发现了一个验证级别为阻塞级别的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,因为可以报错异常,但是也不知道报的是什么异常,再次排查问题时,会很浪费时间

  • 相关阅读:
    IOS开发-cell的动态高度
    IOS开发-视频,音频,录音简单总结
    cocoapods的安装及注意事项
    CUICatalog: Invalid asset name supplied: (null) _configureCellForDisplay:forIndexPath
    IOS开发—数据库的使用
    IOS开发-键盘通知自定义键盘
    IOS开发-手势简单使用及手势不响应处理办法
    IOS开发-UITextField代理常用的方法总结
    Linux Shell 编程学习笔记
    Java的进程内缓存框架:EhCache
  • 原文地址:https://www.cnblogs.com/lucky1212/p/14076433.html
Copyright © 2011-2022 走看看