xuzhengfu / pilot

进入编程世界的第一课
1 stars 0 forks source link

p1-6-structure-5 第六章 程序的基本结构(五):异常处理 #24

Open xuzhengfu opened 4 years ago

xuzhengfu commented 4 years ago

1. 理解 异常处理 的基本的概念

我们前面说过,大多数程序的工作都是:接受输入,对输入进行处理,然后输出结果。这里有个很重要的理念,是所有资深程序员都习惯成自然的认知,那就是 “输入是不可控的”,输入可能是用户通过键盘、鼠标、触控屏输入的,也可能是读取某个设备上一个程序的输出,简言之,都存在不可期的情况。

所有这些错误都在程序运行时才会出现,程序写出来是没有错的,运行时出现奇怪的异常状况,程序又没有好好处理的话,就会出现灾难,这些运行时出现的异常状况就叫 运行时错误(runtime error)或者 运行时异常(runtime exception)。现代编程语言一般都提供标准的异常处理方案,让我们可以写程序来处理这类异常。

Python 提供的异常处理机制可以用下面的模板来说明:

try:
    # 把有可能出现异常的代码放在 try 后面
    # 当出现异常时解释器会捕获异常
    # 并根据异常的类型执行后面的对应代码块
    do_something_nasty()
except ValueError:
    # 如果发生 ValueError 类型的异常则执行这个代码块
    pass
except (TypeError, ZeroDivisionError):
    # 可以一次指定几个不同类型的异常在一起处理exceptions
    # 如果出现 TypeError 或者 ZeroDivisionError 则执行这个代码块
    pass
except:
    # 所有上面没有专门处理的类型的异常会在这里处理
    pass
else:
    # 当且仅当 try 代码块里无异常发生时这个代码块会被执行
    pass
finally:
    # 无论发生了什么这个代码块都会被执行
    # 通常这里是清理性的代码,比如我们在 try 里面打开一个文件进行处理
    # 无论过程中有没有异常出现最后都应该关闭文件释放资源
    # 这样的操作就适合在这里执行

上面出现的关键字 pass 的意思是 “什么也不做”,Python 语法需要有点什么,但是我们暂时什么都不想做的时候放上一个 pass 就可以了。

以 try 开始的异常处理结构可以包含所有这些模块,但并不是都必须有,但至少应该有一个 except 或者 finally。

Python 有很多内置的 运行时错误类型 可以直接使用,比如我们上面看到的:

  • TypeError:当一个操作或者函数收到的参数类型不对,或者一个类型的对象不支持某个被请求的操作时抛出这个异常;
  • ValueError:当一个操作或者函数收到的参数类型对但是值不合法时抛出这个异常;
  • ZeroDivisionError:出现 0 作除数的情况时抛出这个异常。

except ZeroDivisionError as err 这样的语法来取得一个 err 对象,这个对象是系统定义的 Exception 类型或者子类,里面存放着发生异常时的具体上下文信息,可以打印出来也可以做别的处理。

小结

  • 程序处理用户或其他系统提供的输入时可能出现预期之外的异常状况,可以使用异常处理来捕获异常并进行应急处置;
  • 理解 Python 异常处理的模板含义;
  • 通过例子初步了解异常处理可能的应用场景。

Logging

2020-02-21 20:31:52 initialize