zoukankan      html  css  js  c++  java
  • Python学习--异常处理

    一、异常处理

    异常是一个事件,该事件会在程序运行过程中发生,影响了程序的正常执行。

    一般情况下,程序运行过程中会出现各种各样的错误就是我们看到的报错,一旦出错程序就会终止运行。异常是Python对象,如果我们不在程序运行过程中捕获异常那么程序就有可能终止运行。

    举个例子:

    def calc(a, b):
        return a / b
    
    print(calc(5, 1))  #调用,没有错误,结果是5.0
    
    print(calc(5,0)) #再次调用,这时候就不对了,因为被除数不能为0,下面报了一堆错,程序停止运行了
    #ZeroDivisionError: division by zero

    这种情况下就需要捕捉异常了,如果除数是0的话,就提示用户传入的参数不对,重新传入。

    二、异常语法

    Python2.x中返回错误信息变量名称是','或as,在Python3.x中必须要用as。

    try:
        可能会出现异常的代码
    except <异常名字> as <返回错信息变量名称>出现异常后要执行的代码
    else:       
        没有出现异常执行的代码
    finally:
        无论是否出现异常都要执行的代码

    工作原理:

    如果try所包含的代码出现错误,会触发第一个匹配到的except,异常处理完成后,程序继续运行。

    如果try所包含的代码出现错误后,没有匹配到对应的except,则返回上一层try寻找,直到程序的最上层,然后程序结束。

    如果在try所包含的代码执行时没有发生异常,Python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。

    当然如果try含有finally,无论是否遇到异常,都会运行下面的代码。

    捕捉异常使用try....except....关键字,写代码时,我们先要考虑到这段代码可能会出现什么样的错误,然后做对应的处理。

    try里面就是包含你做处理的代码,except里面就是出了某种错误的时候,我怎么去处理,改下上面的代码捕捉异常。

    def calc(a,b):
        try:   #捕获异常
            res = a/b
        except ZeroDivisionError as e:
            return '除数不能为0!'
        except KeyError as e:  # 捕捉KeyError这个异常,当然这段代码没用到字典,所以不会有keyerror这个错误,我只是举个例子
            return 'keyerror错误'
        except Exception as e:  # 这个是捕捉所有的异常,不管你有什么异常都可以捕捉到
            print('其他异常')
            return e  # 返回错误信息
        else:  # 这个else和上面的try对应的,也就是不出异常的话走这里
            print('没有出异常')
            return res
        finally:  # 这个finally是不管这个段代码有没有出异常都走它
            print('出没出异常都走我这里')
    
    print(calc(5,'s'))
    print(calc(5,1))
    print(calc(5,0))

    三、主动抛出异常

    前面的写法我们一直都在被动的等待程序出现异常然后捕获,若想主动抛出某些异常也是可以的(raise)

    主动抛出异常,就是我们在代码里面让它自动抛出一个异常,然后捕捉到。比如说我们在写自动化测试脚本的时候,结果和预期不符合,就可以主动抛出一个异常信息,然后捕捉到,做其他的处理,主动抛出异常使用raise关键字。

    try:
        raise KeyError  # 主动抛出一个keyerror的异常
    except KeyError as e:
        print('我主动抛出了一个KeyError的异常')

    四、常见的异常

    AttributeError: 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
     
    IOError:输入/输出异常,一般是无法打开文件
     
    ImportError: 无法导入模块或包,一般是路径问题或名称错误
     
    IndentationError:代码没有正确对齐,属于语法错误
     
    IndexError:下标索引超出序列边界,比如x只有三个元素,却试图访问x[3]
     
    KeyError:试图访问字典里不存在的键
     
    KeyboardInterrupt:Ctrl+C被按下
     
    NameError:使用一个还未被赋予对象的变量
     
    SyntaxError: 语法错误
     
    TypeError: 传入对象类型与要求的不符
     
    UnboundLocalError:试图访问一个还未被设置的局部变量,一般是由于在代码块外部还有另一个同名变量
     
    ValueError: 传入一个调用者不期望的值,即使值的类型是正确的
     
  • 相关阅读:
    Dijksrta algorithm
    头一回发博客,来分享个有关C++类型萃取的编写技巧
    读书笔记「Python编程:从入门到实践」_4.操作列表
    读书笔记「Python编程:从入门到实践」_3.列表简介
    读书笔记「Python编程:从入门到实践」_2.变量和简单数据类型
    2017/01/20 学习笔记 关于修改和重打jar包
    2017/01/07 学习笔记 jar包,maven
    常用链接
    使用Dir,遍历文件夹下所有子文件夹及文件
    .NET WEB项目的调试发布相关
  • 原文地址:https://www.cnblogs.com/ddxxn/p/11463299.html
Copyright © 2011-2022 走看看