• 异常处理


    异常处理

    概念:在程序运⾏期间,总会遇到各种各样的错误,有些错误是程序编写有问题造 成的,这种错误我们叫bug,bug是必须修复的。

    有些错误是⽤户输⼊有问题 造成的,这种错误可以通过检测⽤户输⼊的内容来做相应的处理。

    还有⼀些 错误是⽆法在程序运⾏过程中预测的,⽐如从⽹络抓取数据,⽹络突然中 断,这类错误称之为异常,

    异常在程序运⾏期间也是必须处理的,否则,程 序也会因为这些问题⽽终⽌。

    常见的异常

    AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

    IOError 输入/输出异常;基本上是无法打开文件

    ImportError 无法引入模块或包;基本上是路径问题或名称错误

    IndentationError 语法错误(的子类) ;代码没有正确对齐

    IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

    KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下

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

    SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

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

    UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它

    ValueError 传入一个调用者不期望的值,即使值的类型是正确的

    异常处理

    格式:try…except...else

    作⽤:⽤来检测try语句中的代码块是否有错误,如果有,让except语句捕获错误信息并处理。

    except,但不匹配任何错误 异常能被正常处理,但异常名称不确定

    try:
        print(10 / 0)
    except:
        print('程序异常,能继续执行')
    '''
    概念:在程序运⾏期间,总会遇到各种各样的错误,有些错误是程序编写有问题造
    成的,这种错误我们叫bug,bug是必须修复的。有些错误是⽤户输⼊有问题
    造成的,这种错误可以通过检测⽤户输⼊的内容来做相应的处理。还有⼀些
    错误是⽆法在程序运⾏过程中预测的,⽐如从⽹络抓取数据,⽹络突然中
    断,这类错误称之为异常,异常在程序运⾏期间也是必须处理的,否则,程
    序也会因为这些问题⽽终⽌。
    '''
    # 程序语法无错误,编译无错,但结论错误:逻辑错误
    print('hello wordl')
    
    # 语法无错误,编译出错:运行时错误
    # print(10/0)  #ZeroDivisionError: division by zero  除数为0了
    
    # 程序语法错误:编译异常
    # print(num1)   #NameError: name 'num1' is not defined   num1为定义
    
    # 使用异常:使程序运行时出现错误,不让程序在该位置终止,可以继续进行操作
    
    # 异常处理-try…except...else
    # 作⽤:⽤来检测try语句中的代码块是否有错误,如果有,让except语句捕获错误信
    # 息并处理。
    
    # 逻辑:当程序执⾏到try…except…else语句时:
    # 1、如果try后⾯的语句在执⾏时出现异常,python就跳回try语句并执⾏第⼀个匹配到该异常的
    # except语句,异常处理完毕后,程序会通过整个try语句(除⾮在处理异常时⼜产⽣新的异常)
    # 2、如果try后⾯的语句在执⾏时出现异常,但是并没有匹配到except语句,异常将会被提交到最
    # 上层的try语句,或者程序的最上层(程序会被终⽌,并打印错误信息)。
    # 3、如果try后⾯的语句在执⾏时没有出现异常,python会执⾏else后⾯的语句(如果else语句存在
    # 的话),然后程序会通过整个try语句向下继续执⾏。
    # 格式:
    try:
        pass
    except:
        pass
    else:
        pass
    
    try:
        print(10 / 0)
    except ZeroDivisionError as e:
        print('除数不能为零')
        print(e)
    except NameError  as e:
        print('未定义')
        print(e)
    else:
        print('异常处理结束了')
    
    # 异常匹配失败  如果匹配失败,该报错还得报错
    # try:
    #     print(10/0)
    # except NameError as e:
    #     print('name出错')
    # else:
    #     print('没有错误')
    
    # 3 except,但不匹配任何错误  异常能被正常处理,但异常名称不确定
    try:
        print(10 / 0)
    except:
        print('程序异常,能继续执行')
    
    # 4 else可有可无
    try:
        print(10 / 0)
    except ZeroDivisionError as e:
        print('除数不能为零')
        print(e)
    else:
        print('异常处理结束了')
    
    # 5.使用except语句,一次性匹配多个异常 在execept后面使用元组,将匹配的的异常名称写在元组中
    try:
        i = [0, 1]
        print(i[10])
    except (NameError, ZeroDivisionError, IndexError):
        print('出现异常了')
    # 1、错误其实是class(类),所有的错误都继承于BaseException,如果在捕获异
    # 常时,如果遇到BaseException这个异常,会将⼦类全部忽略。
    try:
        print(10 / 0)
    except ZeroDivisionError:
        print('ZeroDivisionError')
    except BaseException:
        print('BaseException')
    # 当先匹配到BaseException,就不会执行后面的异常处理,因为BaseException是所有的异常的基类
    try:
        print(10 / 0)
    except BaseException:
        print('BaseException')
    except ZeroDivisionError:
        print('ZeroDivisionError')
    
    
    # 2、可以跨越多层捕获的,fun3调⽤fun2,fun2调⽤fun1,实际上是fun1有问
    # 题,但只要是try能够捕获到,就能够处理
    def fun1():
        print(10 / 0)
    
    
    def fun2():
        fun1()
    
    
    def fun3():
        fun2()
    
    
    try:
        fun3()
    except ZeroDivisionError as e:
        print("我也许会出现")
    
    # 异常处理-try…except...finally
    # finally: ⽆论有没有异常,都会执⾏(如果⼜finally语句的话)
    
    
    # 断言
    # 语法格式:assert 参数1, 参数2
    # 解释:
    # 第⼀个参数为判断条件,
    # 当条件成⽴时,代码继续向下执⾏;
    # 当条件不成⽴时,程序直接结束在assert语句,提出AssertionError;
    
    # 第⼆个参数:为错误提示语
    
    def func1(num1,num2):
        assert (num2!=0),'第二个参数不为零'
        print(num1/num2)
    func1(10,0)

    仅供参考

  • 相关阅读:
    第6章 静态路由和动态路由(2)_路由汇总和默认路由
    第6章 静态路由和动态路由(1)_静态路由
    第5章 IP地址和子网划分(4)_超网合并网段
    第5章 IP地址和子网划分(3)_子网划分
    第5章 IP地址和子网划分(2)_IP地址分类和NAT技术
    第5章 IP地址和子网划分(1)_IP格式和子网掩码
    第4章 数据链路层(5)_高速以太网
    第4章 数据链路层(4)_扩展以太网
    第4章 数据链路层(3)_广播信道的数据链路
    第4章 数据链路层(2)_点到点信道的数据链路
  • 原文地址:https://www.cnblogs.com/dyd520/p/11264834.html
Copyright © 2020-2023  润新知