Python之异常处理机制

一、异常介绍

Python中使用异常对象来表示异常,遇到错误的时候就会引发异常。

异常对象未被捕获时,程序将终止并显示一条错误消息。

如果是函数不处理引发的异常,它将向上传到调用函数的地方。如果在那里也未处理,异常将继续传播,直至到达主程序。如果主程序也未处理异常,程序将终止并显示栈跟踪消息(traceback)。异常示例如下:

a = 3b = 0a/b
Traceback (most recent call last):  File "F:\Users\test.py", line 3, in <module>    a/b    ~^~ZeroDivisionError: division by zero

每个异常都是某个类的实例,这里是ZeroDivisionError。你可以引发或者捕获这些异常,做自己需要的一些措施。

对于异常报错,可以观察~^~中“^”的位置,一般都是出现错误的地方,可以重点查看代码。

如果需要自己引发异常,可使用raise语句,并将一个类(必须是Exception的子类)或实例作为参数。将类作为参数时,将自动创建一个实例。

raise Exception
Traceback (most recent call last):  File "F:\test.py", line 1, in <module>    raise ExceptionException​​​​​​raise 333
Traceback (most recent call last):  File "F:\test.py", line 1, in <module>    raise 333TypeError: exceptions must derive from BaseException

                                           常见内置异常类

Exception几乎所有的异常类都是从它派生而来的
IndexError序列中没有此索引
ZeroDivisionError除或取模零引发
TypeError类型错误时引发
KeyError映射中不存在的键引发
NameError未声明或未初始化对象
SyntaxError代码语法错误时引发
ValueError传入无效参数

二、异常的处理

1、自定义异常类

同创建其他类一样,但需要直接或间接地继承Exception。

class MyExcept(Exception):    def myex(self):        print('自定义异常类')
try:    raise MyExceptexcept MyExcept as e:   e.myex()    输出: 自定义异常类

2、捕获异常

可使用 try/except语句。​​​​​​​

try:    10/0except ZeroDivisionError:   print('捕获到了异常')   输出:捕获到了异常

如果不处理异常,在except子句中使用不带参数的raise,但有时你可能想引发别的异常。

在这种情况下,导致进入except子句的异常将被作为异常上下文存储起来, 并出现在最终的错误消息中。​​​​​​​

try:    10/0except ZeroDivisionError:   raise   输出:Traceback (most recent call last):  File "F:\test.py", line 8, in <module>    10/0    ~~^~ZeroDivisionError: division by zero
##################################################
try:    10/0except ZeroDivisionError:   raise ValueError 异常输出:Traceback (most recent call last):  File "F:\test.py", line 2, in <module>    10/0    ~~^~ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):  File "F:\test.py", line 4, in <module>    raise ValueErrorValueError

其中捕获到了ZeroDivisionError异常,但是raise又抛出异常ValueError,此时会将except信息存储起来,显示在错误消息里面,如果不抛出except的信息,可以使用from None,None位置处也可以自定义自己的异常。​​​​​​​

try:    10/0except ZeroDivisionError:   raise ValueError from None   异常输出:Traceback (most recent call last):  File "F:\test.py", line 4, in <module>    raise ValueError from NoneValueError

多个except字句。​​​​​​​

try: x = 1 y = 'e' print(x / y)except ZeroDivisionError: print("第二个参数不能为0!")except TypeError: print("参数类型错误?")
输出:参数类型错误?
try: x = 1 y = 0 print(x / y)except ZeroDivisionError: print("第二个参数不能为0!")except TypeError: print("参数类型错误?") 输出:第二个参数不能为0!

一次性捕获多个异常,可以在最后增加BaseException,避免遗漏可能出现的异常。​​​​​​​

try: x = 1 y = 0 print(x / y)except (ZeroDivisionError, TypeError): print("参数错误!")except BaseException print("其他错误!") 输出: 参数错误

捕获异常并打印错误信息。​​​​​​​

try: x = 1 y = 0 print(x / y) except (ZeroDivisionError, TypeError) as e: print(e)  输出: division by zero

捕获所有异常。​​​​​​​

try: x = 1 y = 0 print(x / y)except : print('异常了') 输出:异常了
try: x = 1 y = 0 print(x / y)except Exception as e: print(e)  输出: division by zero

上面第一种直接使用except捕获方式可能对于不是从Exception派生出来的类无法捕获到异常,建议使用 except Exception as e 方式,并且还可以显示错误详细信息。

三、异常else和finally 

1、try except  else语句

如果try中没有抛出异常,则执行else,如果try中抛出异常,则执行except。​​​​​​​

try:    x = 1    y = 5    print(x / y)except Exception as e:    print(e)else:    print('没有错误')    输出:0.2没有错误

try except  else finally 语句,finally无论是否发生异常都会执行,常用来释放try中申请的资源。​​​​​​​

try:    x = 1    y = 0    print(x / y)except Exception as e:    print(e)else:    print('没有错误')finally:    print('end')    输出:division by zeroend

四、traceback打印异常信息

有时候需要打印异常信息,可以使用traceback模块打印。​​​​​​​

import traceback
try:    print(11111111111)    10/0    print(22222222222)except ZeroDivisionError:   traceback.print_exc()   输出:11111111111Traceback (most recent call last):  File "F:\test.py", line 9, in <module>    10/0    ~~^~ZeroDivisionError: division by zero

五、其他

大多数时候,习惯使用条件语句if/else来处理异常,但这样写出来的代码可读性没那么高,可以替换使用try/except来完成。



关注公众号同步更新:

 三四五才醒的程序员  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值