python自定义全局异常_Python基础-异常

异常捕获

常见异常类型

Exception:顶级异常类,大部分异常类都是它的子类。

SyntaxError:语法错误

TypeError:类型错误

ValueError:值错误

NameError:找不到名称,比如变量名

IndexError:找不到索引,在序列中取值时出现

KeyError:映射中不存在键名,在字典中取一个不存在的key时出现

ZeroDivisionError:除法中除数为0时出现

FileNotFoundError:找不到文件错误

捕获指定异常

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

a = 10b=0try:

result= a /bprint(f"结果是:{result}")exceptZeroDivisionError:print('除数不能为0')

打印结果:

除数不能为0

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

a = 10b= 'abc'

try:

result= a /bprint(f"结果是:{result}")exceptZeroDivisionError:print('除数不能为0')exceptTypeError:print('类型错误')

打印结果:

类型错误

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

a = 10b= 'abc'

try:

result= a /bprint(f"结果是:{result}")except(ZeroDivisionError,TypeError) as e:print(e)

打印结果:

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

捕获所有异常

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

a = 10b= 'abc'

try:

result= a /bprint(f"结果是:{result}")except:print('出现异常了')

打印结果:

出现异常了

主动抛出异常

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

a = 10b=0try:if b == 0 : raise Exception('竟然是0!')

result= a /bprint(f"结果是:{result}")exceptException as e:print(f'出现异常了:{e}')

打印结果:

出现异常了:竟然是0!

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

未发生异常时

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

a = 10b= 2

try:if b == 0 : raise Exception('竟然是0!')

result= a /bprint(f"结果是:{result}")exceptException as e:print(f'出现异常了:{e}')else:print('程序一切正常')

打印结果:

结果是:5.0

程序一切正常

扫尾工作

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

a = 10b=0try:if b == 0 : raise Exception('竟然是0!')

result= a /bprint(f"结果是:{result}")exceptException as e:print(f'出现异常了:{e}')else:print('程序一切正常')finally:print('扫尾工作清理')

打印结果:

出现异常了:竟然是0!

扫尾工作清理

自定义异常

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

classMyError(Exception):pass

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

打印结果:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值