zoukankan      html  css  js  c++  java
  • 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}')

    打印结果:

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

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

  • 相关阅读:
    C#编程思路
    将字符串类型字段转为map类型字段,使用str_to_map()函数
    写hive脚本时,如果hive的过滤条件比较多。可以把过滤条件放到一个参数里。然后把参数放到过滤条件处。这样以后只需要改参数就可以了
    linux中. 路径/文件
    inner join ,left join 会导致数据发散
    如何批量按分区插入数据
    hive表添加字段后,查不出数据是咋回事?
    linux中$0的含义
    linux中的$#含义
    linux的语法
  • 原文地址:https://www.cnblogs.com/fengyumeng/p/13344494.html
Copyright © 2011-2022 走看看