美文网首页
python学习笔记之--异常处理

python学习笔记之--异常处理

作者: itsenlin | 来源:发表于2022-01-09 21:14 被阅读0次

类似于C++/Java等高级语言,python也有异常的处理机制

异常捕获和处理

在python语言中python的异常捕获处理有以下几种方式

try-except语句

  • 单个异常
    try:
        正常流程代码
    except IOError, e:
        IOError异常出现时执行流程
    
  • 多个异常
    1. 多个except
      try:
          正常流程代码
      except IOError, e:
          IOError异常出现时执行流程
      except ValueError:
          ValueError异常出现时执行流程
      
    2. 单个except
      try:
          正常流程代码
      except (IOError, ValueError), e:
          IOError或者ValueError异常出现时执行流程
      
  • 捕获所有异常
    有两种方式
    1. except后面跟最顶层的异常类BaseException
      try:
          正常流程代码
      except BaseException, e:
          所有异常出现时都会执行流程
      
    2. except后面不跟异常类型
      try:
          正常流程代码
      except:
          所有异常出现时都会执行流程,这种情况无法获取错误原因,可以通过sys.exc_info()获取
      

python中异常关系


image.png

else子句

类似python的while/for循环语句,异常处理机制中也可以包含else子句,只在不出现异常的时候才会执行

要求,else子句必须在所有的except子句后面

try:
  正常流程
except XXX:
  异常流程
else:
  如果未发生异常,则正常流程之后会走此流程

finally子句

如果使用finally子句,无论是否发生异常,finally子句中的流程都会被执行,有三种用法

  • try-finally
  • try-except-finally
  • try-except-else-finally
try:
  正常流程:1
except:
  异常流程:2
else:
  else子句流程:3
finally:
  finally子句流程:4
  1. 当无异常发生时,执行流程1,3,4
  2. 当有异常发生时,执行流程1,2,4

触发异常

python语言通过raise关键字主动触发一个异常,语法如下:

raise [SomeException [, args [, traceback]]]

例如:

>>> x = 10
>>> if x > 5:
...     raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
Exception: x 不能大于 5。x 的值为: 10
>>>

断言

断言错误(AssertionError)是从Exception继承的一个子异常类,这里单独列出来,是因为类似其他语言的断言,python中也有一个assert语句来直接实现并且用法很简单,语法如下

assert expression[, args]

例如:

>>> assert 1 == 1
>>> assert 1 == 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> assert 1 == 2, "1 == 2?"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: 1 == 2?
>>>

说明:assert语句的excepression必须等价于一个布尔表达式,args可以存放自定义错误的原因,如上面的例子

with语句

语法

python2.6版本引入了with语句,此语句相当于封装了try-except-finally语句,提高了易用性;

with context_expr [as var]:
  with_suit

用法

在处理文件时使用with语句是一个很好的选择,对比如下

  • 不使用异常处理时
file = open(...)
file.write(...)
file.close

很显然这种处理方式很糟糕,当要打开的文件无权访问时,程序会直接崩溃

  • try-except-finally语句
file = open(...)
try:
    file.write(...)
finally:
    file.close()

这种处理比较中规中矩,捕获异常,并在finally里进行清理工作

  • with语句
with open(...) as file:
  file.write(...)

这种处理要比显示的捕获处理异常来得简单很多,代码也比较清晰

原理

with语句实现原理建立在上下文管理器之上,
上下文管理器是一个实现 __enter____exit__方法的类。
使用 with 语句确保在嵌套块的末尾调用__exit__方法。

自定义异常类

可以通过直接或者间接继承自Exception类,来创建自定义的异常类,类相关学习后续单独总结

相关文章

网友评论

      本文标题:python学习笔记之--异常处理

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