zoukankan      html  css  js  c++  java
  • 异常处理语句

    在程序的编写过程中会出现各种错误,语法错误在程序启动时就会检测出来,它是程序正常运行的前提条件。程序中还有一种错误发生在程序运行后,可能是由于逻辑问题,又或者是业务发生了改变,为了能让用户有更好的体验,加强代码的健壮性,我们需要对这些错误进行处理,也叫异常处理。
    在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误

    程序运行中的异常可以分为两类:语法错误和逻辑错误。首先,我们必须知道,语法错误跟异常处理无关,所以我们在处理异常之前,必须避免语法上的错误。

    在 python 中通过 try-except 语句进行异常处理。
    try-except 语句的基本语法格式如下:

    try:
    <语句块1>
    except <异常类型1>:
    <语句块2>
    except <异常类型2> :
    <语句块3>
    else:
    <语句块4>
    finally:
    <语句块5>
    语句块 1 中的代码如果发生异常,且异常与类型与对应 excep 语句中的异常类型相同则会被其捕获,从而执行对应的语句块
    没有发生异常时,会执行 else 语句后的代码块,不管有没有发生异常,finally 语句后的代码块一定会执行

    常见异常类型
    AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
    IOError 输入/输出异常;基本上是无法打开文件
    ImportError 无法引入模块或包;基本上是路径问题或名称错误
    IndentationError 语法错误(的子类) ;代码没有正确对齐
    IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
    KeyError 试图访问字典里不存在的键
    KeyboardInterrupt Ctrl+C被按下
    NameError 使用一个还未被赋予对象的变量
    SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
    TypeError 传入对象类型与要求的不符合
    UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
    导致你以为正在访问它
    ValueError 传入一个调用者不期望的值,即使值的类型是正确的

    在python的异常中,有一个万能异常:Exception,他是所有异常的父类,可以捕获任意异常。它是一把双刃剑,有利有弊,我们要视情况使用

      如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么只有一个Exception就足够了。

      如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。我们可以使用多分支+万能异常来处理异常。使用多分支优先处理一些能预料到的错误类型,一些预料不到的错误类型应该被最终的万能异常捕获。需要注意的是,万能异常一定要放在最后,否则就没有意义了。

    我们可以使用except与as+变量名 搭配使用,变量名存储的是具体的错误信息,打印变量名会直接输出报错信息
    def dealwith_file():
    try:
    f = open('file',encoding='utf-8')
    for line in f:
    int(line)
    return True
    except Exception as e:
    print(e)
    return False
    finally:
    '''不管try语句中的代码是否报错,都会执行finally分支中的代码'''
    '''去完成一些连接操作的收尾工作'''
    print('finally 被执行了')
    f.close()
    ret = dealwith_file()
    print(ret)

    主动触发异常
    try:
    raise TypeError('类型错误')
    except Exception as e:
    print(e)

    先完成功能 在测试的时候 一边修改代码 一边加上异常处理,只要加上异常处理,一定要写日志,不要在大段的代码外直接套上异常处理。应该是在具体的逻辑上(具体的细节处的代码段)加上细粒度异常处理。对于可以预料到的异常 一定要尽力的疏导 如果不能解决 必须要写上提示以及引发错误的原因

    assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。

    assert的异常参数,其实就是在断言表达式后添加字符串信息,用来解释断言并更好的知道是哪里出了问题。格式如下:
    assert expression [, arguments]
    assert 表达式 [, 参数]

    assert len(lists) >=5,'列表元素个数小于5'
    assert 2==1,'2不等于1'
    备注:格式:assert 条件 , 条件为false时的错误信息 结果为raise一个AssertionError出来

  • 相关阅读:
    针对大数据量 高并发量网站的解决方案
    session cookie 在用户登录中的使用
    彻底弄懂HTTP缓存机制及原理
    cookie 和session 的区别详解
    常见的浏览器兼容性问题
    内容分发网络(CDN)
    表现与数据分离、Web语义化
    关于bootstrap样式重写,无法覆盖的问题
    判断一个字符串中出现次数最多的字符
    [译]SQL Passion Week 10: 计划缓存
  • 原文地址:https://www.cnblogs.com/sayi2020/p/13906927.html
Copyright © 2011-2022 走看看