python 进阶(12) -- try 异常处理


纯白是黑夜的给予,鲜红铸就生命之美丽


缘由

虽然很久以前就接触了这块,但由于每次写程序的时候都是没有意识的进行异常处理的节奏,搞得需要运行挺久的程序后续出错了又得重来,实在是有些浪费时间,所以也算是好好地复习一下这块,之后尽量使用


异常与错误的区别

错误

  1. 代码运行前的语法或语法错误
  2. 语法错误在执行前修改,逻辑错误无法修改

异常

  1. 异常产生:检查到错误且解释器认为是异常,抛出异常
  2. 异常处理:截获异常,忽略或者终止程序处理异常

常见错误

python 的标准错误在官网上貌似有几十种,但是很多都是比较少接触的,这里就简单地错一下,找个'榜样'

  1. NameError
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
  1. SyntaxError
>>> a = 5
>>> if a
  File "<stdin>", line 1
    if a
       ^
SyntaxError: invalid syntax
  1. ZeroDivisionError
>>> a = 3/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
  1. ValueError
>>> a = int("a12")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'a12'

try-except 异常处理

当捕获的异常和 except 设置的异常相同时,进入 except 执行,如果不相同则交由 python 解释器处理错误

In [5]: try:
   ...:     a
   ...: except NameError as e:
   ...:     print("Error is -- ",e)
   ...:
Error is --  name 'a' is not defined

try-except-else 异常处理

如果没有捕获到异常,就执行 else 语句内容

In [6]: try:
   ...:     a=1
   ...: except NameError as e:
   ...:     print("Error is -- ",e)
   ...: else:
   ...:     print("no Error.")
   ...:
no Error. 

try-finally 异常处理

无论是否检测到异常,都会执行 finally 代码 为异常处理提供清理机制,用来关闭文件或释放资源

比如,我们打开一个文件之后,如果在处理文件的过程中出现错误的话,可以现在 finally 中把文件关掉,之后再由 except 或 python 解释器处理异常


assert 和 raise

arise 用于主动抛出异常

In [13]: raise ValueError("hello")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-13-d7ed59243d37> in <module>()
----> 1 raise ValueError("hello")

ValueError: hello

assert 为断言语句,用于检测语句是否为真,假的话会抛出异常

In [14]: assert 0,"hello"
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-14-06268a1684c1> in <module>()
----> 1 assert 0,"hello"

AssertionError: hello

In [15]: assert 1,"hello"

ariseassert 因为之前没有遇到过,所以当做是简单了解一下吧