67 lines
4.0 KiB
Markdown
67 lines
4.0 KiB
Markdown
# python3小白课:最基本的异常处理
|
||
|
||
### 为什么要进行异常处理
|
||
|
||
我们先来从理论的角度来谈谈学习和恰当使用异常处理的必要性。
|
||
|
||
在计算机程序编写的时候,没有人能保证自己编写的程序能永远不出错!就连我也不能!
|
||
|
||
即使保证了编写所有代码的语法全部正确,也没法避免突发情况,比如让用户输入内容的时候,你能保证用户不会输入你无法处理的内容?比如你能保证运行的电脑不会突然出现硬件故障?比如你能保证需要网络的程序,网络不会突然断掉?突发情况是我们无法一一枚举的,这时候脚本直接终止并不是一个好主意。
|
||
|
||
> [!tip]
|
||
>
|
||
> 对于一个程序的健壮性而言,开发者仅仅做“对”的事是远远不够的,你还要考虑到很多东西,很多方面,有的时候,还需要堵住一些常见的漏洞,对整个过程要有全面的考虑。
|
||
|
||
当程序运行出现意外情况的时候,系统会自动生成一个Error对象来通知程序,如果我们没有做异常处理,那么程序就会像我们之前看到的那样直接罢工不干,如果我们编写了相关的异常处理代码,则会进行“错误处理”,以便让程序能够继续运行下去。
|
||
|
||
---
|
||
|
||
### 使用try...except结构捕获并处理异常
|
||
|
||
异常处理的通用结构语法如下(这是日常我用得最多的一种结构,一般来说,刚开始仅掌握这种结构也基本上够用了):
|
||
|
||
```python
|
||
try:
|
||
# 业务执行代码,这里面可能会有让程序报错的代码,放到这里来
|
||
...
|
||
except Exception as e:
|
||
# 如果在try块的代码中有报错的代码,则会执行except块的代码,否则不执行
|
||
...
|
||
```
|
||
|
||
是不是很像流程控制的赶脚?对的,就是需要注意缩进的。
|
||
|
||
我们可以将可能出现问题的代码放到try块中,如果报错则会执行except块中的代码。`Exception`是一个通用的异常类,基本上各种异常都基于此类来派生,所以写它一般就可以了,至于其他更高级的应用我们后面课程会讲。`as e`是把捕获的异常赋值给一个自定义的变量`e`,当然你也可以写其他的名字,约定俗成一般用这个。这个`e`我们称之为被赋值后的异常对象,通过这个异常对象我们可以获取相关的异常信息。在except块中,一般可以print这个值`e`用来查看具体的异常是什么。关于异常对象,后面的课程中将会有更详细的讲解。
|
||
|
||
我们来看一个小例子:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
try:
|
||
# 除数不能为0,所以一定会报错
|
||
a = 1 / 0
|
||
except Exception as e:
|
||
print(e)
|
||
```
|
||
|
||
是不是很简单呢?
|
||
|
||
> [!danger]
|
||
>
|
||
> 有的同学会说,那么我们把所有的业务代码都放到try块中不就不会有任何问题了吗?我们需要小心的是,在try语句块中的代码不要有太多,因为过多的代码语句放到try块中,出现异常的可能性就会大大增加,后续分析异常原因的难度也会大大增加。而且有的时候可能要针对不同的异常类提供不同的处理逻辑(关于不同的异常类,我们在后面的课程中会讲到),这样编程的难度就会增加。
|
||
>
|
||
> 所以我们的原则是,写多个try...except块,把感觉可能出现异常的程序段落分别写到多个try块里,分别捕获不同的异常并针对性处理。对于基本不大可能出现问题的程序段落,就像我们往常一样正常写就好了,可以不放到异常处理段落里。
|
||
|
||
|
||
|
||
### 单词释义
|
||
|
||
| 单词 | 释义 |
|
||
| --------- | --------------------------------- |
|
||
| try | 尝试 |
|
||
| except | 除...之外,这里为异常处理的关键字 |
|
||
| Exception | 例外 |
|
||
| as | 把...作为... |
|
||
| division | 除法 |
|
||
| by | 被... |
|
||
| zero | 零 | |