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

    异常处理

    概念:在程序运⾏期间,总会遇到各种各样的错误,有些错误是程序编写有问题造 成的,这种错误我们叫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)

    仅供参考

  • 相关阅读:
    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用
    jQuery UI组件库Kendo UI使用技巧小分享
    Kendo UI ListView模板功能,让Web开发更轻松
    UI组件套包DevExpress ASP.NET Core v20.2新版亮点:全新的查询生成器
    Devexpress WinForms最新版开发.NET环境配置Visual Studo和SQL Server对应版本
    全新的桌面应用数据可视化呈现方式,Sankey Diagram控件你了解多少?
    java中的递归方法
    连接数据库查询 将查询结果写入exce文件中
    java连接mysql数据查询数据
  • 原文地址:https://www.cnblogs.com/dyd520/p/11264834.html
Copyright © 2011-2022 走看看