美文网首页视觉艺术
【无为则无心&Python基础】— 67.异常

【无为则无心&Python基础】— 67.异常

作者: 繁华似锦Fighting | 来源:发表于2020-06-27 06:18 被阅读0次

    (一)异常概念

    定义:程序在运行过程当中,不可避免的会出现一些错误,可能经常看到的报错信息,例如:NameErrorTypeErrorValueError等,这些都是异常。

    程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行。所以当Python程序发生异常时,我们需要捕获并处理异常,否则程序就会终止执行,影响程序的正常执行。

    (二)了解异常

    当检测到一个错误时,解释器就无法继续执行了,会出现一些错误的提示到控制台,这就是所谓的"异常"。

    例如:以r方式打开一个不存在的文件,就会抛出异常,我们在控制台中就能够看到。

    open('test.txt', 'r')
    

    像上面这种情况,我们在编写代码的时候,我们不确定一个语句是否一定会正确执行,这个时候就可以把这句可能出现的问题的代码,放入到异常语句中。

    因为异常语句会尝试执行一行或一段可能发生错误的代码,万一发生错误可以执行另外一行或一段一定可以执行的代码,从而替代有错误的代码。以达到让程序不报错,可以继续向下执行程序。

    总结:

    Python程序运行时出现异常,目的并不是让我们的程序直接终止。

    而是Python是希望在出现异常时,我们可以编写代码来对异常进行处理。

    (三)异常的写法

    1、语法

    try:
        可能发生错误的代码
    except:
        如果出现异常执行的代码(出现错误以后的处理方式)
    

    2、快速体验

    需求:尝试以r模式打开文件,如果文件不存在,则以w方式打开。

    try:
        f = open('test.txt', 'r')
    except:
        f = open('test.txt', 'w')
    

    3、捕获指定异常

    (1)语法

    try:
        可能发生错误的代码
    except 异常类型:
        如果捕获到该异常类型执行的代码
    

    说明:如果我们执行的代码有错误,且错误类型和except指定的异常类型一致,则执行匹配类型异常下定义的代码。

    总结:

    • 如果except后不跟任何的内容,则此时它会捕获到所有的异常。
    • 如果在except后跟着一个异常的类型,那么此时它只会捕获该类型的异常。

    (2)体验

    """
    需求:尝试执行打印num,捕获异常类型NameError,
    如果捕获到这个异常类型,执行打印:你的变量没有被定义
    """
    # 结果:你的变量没有被定义
    try:
        print(num)
    except NameError:
        print('你的变量没有被定义')
    
    

    注意:

    1. 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
    2. 一般try下方只放一行尝试执行的代码。

    (3)捕获多个指定异常

    有时候我们编写代码的时候,并不确定一行代码可能抛出哪种异常类型,可能就会多写几种异常类型。

    当捕获多个异常时,可以把要捕获的异常类型的名字,统一放到except 后,并使用元组的方式进行书写。

    try:
        print(1/0)
    except (NameError, ZeroDivisionError):
        print('有错误')
    

    只要尝试执行的异常代码,所抛出来的异常类型,和except后定义在元组中的任一异常类型相匹配,都能被捕获到。

    不同类型的异常类型也可以分开写,如下:

    try:
        print(10/0)
    except NameError:
        print('出现 NameError 异常')
    except ZeroDivisionError:
        print('出现 ZeroDivisionError 异常')
    except IndexError:
        print('出现 IndexError 异常')
    

    (4)何为异常类型何为异常描述信息

    在控制台查看的异常信息中,如NameError: name 'num' is not defined

    冒号前NameError,显示的就是异常类型。

    冒号后name 'num' is not defined,显示的就是异常描述信息。

    (5)捕获异常描述信息

    try:
        print(num)
    except (NameError, ZeroDivisionError) as result:
        print(result)
        
    # 或者
    try:
        print(10/0)
    except NameError as e:
        print('异常类型',e)
    except ZeroDivisionError as e:
        print('异常类型',e)
    except IndexError as e:
        print('异常类型',e)
    

    as是一个关键字,as关键字后的变量就是捕获到的异常的描述信息,变量名是可以自定义的。

    (6)捕获所有异常

    Exception是所有程序异常类的父类,所以如果except后跟的是Exception,也会捕获到所有的异常。

    # 1.捕获所有异常
    try:
        print(num)
    except Exception:
        print("捕获异常了")
        
    # 或者不写Exception
    try:
        print(num)
    except:
        print("捕获异常了")
    
    # 2.捕获所有异常信息
    try:
        print(num)
    except Exception as result:
        print(result)
    

    4、异常的else

    else表示的是如果没有异常要执行的代码。

    try:
        print(1)
    except Exception as result:
        print(result)
    else:
        print('我是else,是没有异常的时候执行的代码')
    

    5、异常的finally

    finally表示的是,无论是否异常都要执行的代码。也就是说,不管前边代码是否正确执行,都必须只要执行的代码,就写在finally中。例如关闭文件。

    try:
        f = open('test.txt', 'r')
    except Exception as result:
        f = open('test.txt', 'w')
    else:
        print('没有异常,真开心')
    finally:
        # 一般用于关闭所有打开的资源
        f.close()
    

    6、总结

    异常处理的完整结构

    try语句
        try:
            代码块(可能出现错误的语句)
        except 异常类型 as 异常名:
            代码块(出现错误以后的处理方式)
        except 异常类型 as 异常名:
            代码块(出现错误以后的处理方式)
        except 异常类型 as 异常名:
            代码块(出现错误以后的处理方式)
        else:
            代码块(没出错时要执行的语句)    
        finally:
            代码块(该代码块总会执行)      
    

    说明:

    • try是必须写的,可以将可能出错的代码放入到try语句中,这样如果代码没有错误,则会正常执行。如果出现错误,则会执行expect子句中的代码,这样我们就可以通过代码来处理异常, 避免因为一个异常导致整个程序的终止 。
    • else语句有没有都行。
    • exceptfinally至少有一个 。

    相关文章

      网友评论

        本文标题:【无为则无心&Python基础】— 67.异常

        本文链接:https://www.haomeiwen.com/subject/zgcufktx.html