• 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: 传入一个调用者不期望的值,即使值的类型是正确的
     
  • 相关阅读:
    HAProxy、Keepalived 在 Ocatvia 的应用实现与分析
    Octavia 的 HTTPS 与自建、签发 CA 证书
    Octavia 创建 loadbalancer 的实现与分析
    OpenStack Rally 质量评估与自动化测试利器
    自建 CA 中心并签发 CA 证书
    Failed building wheel for netifaces
    通过 vSphere WS API 获取 vCenter Datastore Provisioned Space 置备空间
    OpenStack Placement Project
    我们建了一个 Golang 硬核技术交流群(内含视频福利)
    没有图形界面的软件有什么用?
  • 原文地址:https://www.cnblogs.com/ddxxn/p/11463299.html
Copyright © 2020-2023  润新知