• Python基础-异常


    异常捕获

    常见异常类型

    Exception:顶级异常类,大部分异常类都是它的子类。
    SyntaxError:语法错误
    TypeError:类型错误
    ValueError:值错误
    NameError:找不到名称,比如变量名
    IndexError:找不到索引,在序列中取值时出现
    KeyError:映射中不存在键名,在字典中取一个不存在的key时出现
    ZeroDivisionError:除法中除数为0时出现
    FileNotFoundError:找不到文件错误

    捕获指定异常

    异常捕获的写法结构是try-except,下面模拟一个除数为0的异常。

    a = 10
    b = 0
    try:
        result = a / b
        print(f"结果是:{result}")
    except ZeroDivisionError:
        print('除数不能为0')

    打印结果:

    除数不能为0

    我们虽然捕获了ZeroDivisionError,但是也可能出现其他异常,比如a和b不是数字呢?那么我们如果想单独对每一种异常都进行精确捕获与提示的话,可以多写几个except,针对性处理。

    a = 10
    b = 'abc'
    try:
        result = a / b
        print(f"结果是:{result}")
    except ZeroDivisionError:
        print('除数不能为0')
    except TypeError:
        print('类型错误')

    打印结果:

    类型错误

    如果想多个异常统一处理,也可以同时捕获多个异常。

    a = 10
    b = 'abc'
    try:
        result = a / b
        print(f"结果是:{result}")
    except (ZeroDivisionError,TypeError) as e:
        print(e)

    打印结果:

    unsupported operand type(s) for /: 'int' and 'str'

    捕获所有异常

    捕获所有异常是最省心的做法,你不用去纠结到底这段代码可能会出现哪些异常。

    a = 10
    b = 'abc'
    try:
        result = a / b
        print(f"结果是:{result}")
    except:
        print('出现异常了')
    
    打印结果:
    出现异常了

    主动抛出异常

    raise语句对标java和PHP中的throw,作用是抛出异常。

    a = 10
    b = 0
    try:
        if b == 0 : raise Exception('竟然是0!')
        result = a / b
        print(f"结果是:{result}")
    except Exception as e:
        print(f'出现异常了:{e}')

    打印结果:

    出现异常了:竟然是0!

    raise不仅可以在try-except语句块里面用,也可以在全局使用,在try-except里面抛出异常,会被except捕获,如果在没有try-except代码中使用的话,异常就会向上传递,传给调用方,直到传到主程序全局空间,然后停止程序运行,打印出栈跟踪信息。

    未发生异常时

    try-except语句还可以包含else代码块,让我们可以像条件判断一样进行异常处理,如果出现异常怎么办,如果没有异常又怎么办。

    a = 10
    b = 2
    try:
        if b == 0 : raise Exception('竟然是0!')
        result = a / b
        print(f"结果是:{result}")
    except Exception as e:
        print(f'出现异常了:{e}')
    else:
        print('程序一切正常')

    打印结果:

    结果是:5.0
    程序一切正常

    扫尾工作

    try-except还有一个finally代码块,无论是否异常都一定会执行finally代码块中的代码,比如打开文件之后做一些业务处理,无论过程是否出现异常,都必须要关闭文件,那么关闭文件的操作就应该放在finally代码块中。

    a = 10
    b = 0
    try:
        if b == 0 : raise Exception('竟然是0!')
        result = a / b
        print(f"结果是:{result}")
    except Exception as e:
        print(f'出现异常了:{e}')
    else:
        print('程序一切正常')
    finally:
        print('扫尾工作清理')

    打印结果:

    出现异常了:竟然是0!
    扫尾工作清理

    自定义异常

    自定义异常类需要继承Exception类,直接继承或间接继承都可以。

    class MyError(Exception):
        pass
    
    try:
        raise MyError('随便抛')
    except MyError as e:
        print(f'捕获到了自定义异常:{e}')

    打印结果:

    捕获到了自定义异常:随便抛

    如果你愿意,也可以在自定义异常类中覆盖父类的构造函数,或者添加方法都可以。

  • 相关阅读:
    398. Random Pick Index
    382. Linked List Random Node
    645. Set Mismatch
    174. Dungeon Game
    264. Ugly Number II
    115. Distinct Subsequences
    372. Super Pow
    LeetCode 242 有效的字母异位词
    LeetCode 78 子集
    LeetCode 404 左叶子之和
  • 原文地址:https://www.cnblogs.com/fengyumeng/p/13344494.html
Copyright © 2020-2023  润新知