本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Basic/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接:https://pan.baidu.com/s/1x2Ynh_VibPY2u-HWTaJo8w?pwd=mnsj
提取码:mnsj
-
前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Basic
——————————————————
当一个程序发生异常时,默认情况下程序会被终止。为了避免程序退出,就可以采用捕获异常的方式获取这个异常的类型名称,再通过其他的逻辑代码让程序继续运行,这种根据异常做出的逻辑处理就称作异常处理。
1.异常处理基本语法:try-except语句
Python通过try-except
语句提供程序异常处理功能,其基本用法如下所示,语句块1是正常执行的程序内容,当发生异常时会执行except后面的语句块:
1try:
2 <语句块1>
3except <异常类型>:
4 <语句块2>
例如下面的代码,不添加异常处理时,当输入超过char长度的数字时,程序就会报IndexError
异常。
1char = 'ABCDEF'
2num = eval(input('请输入一个数字:'))
3print(char[num])
添加了异常处理后,当输入超过char长度的数字时,程序会输出except下的语句。
1try:
2 char = 'ABCDEF'
3 num = eval(input('请输入一个数字:'))
4 print(char[num])
5except IndexError:
6 print('输入错误,请输入小于6的数字!')2.异常处理的高级用法:
2.1 多个except语句:
try-except
语句支持多个except语句,基本用法如下所示: 1try:
2 <语句块1>
3except <异常类型1>:
4 <语句块2>
5......
6except <异常类型n>:
7 <语句块n+1>
8except:
9 <语句块n+2>
该方式属于分支结构的一种表达方式,可以针对不同的异常类型执行不同的语句。
1# 当输入不为数字时,NameError异常会被捕捉,输出对应信息
2# 当输入数字超出字符串长度时,输出对应信息
3
4try:
5 char = 'ABCDEF'
6 num = eval(input('请输入一个数字:'))
7 print(char[num])
8except IndexError:
9 print('输入错误,请输入小于6的数字!')
10except:
11 print('发生其他错误!')
当输入数字超出字符串长度以及输入字符串时,程序输出结果如下:
1请输入一个数字:11
2请输入小于6的数字!
3
4请输入一个数字:a
5发生其他错误!
2.2 except语句接受多个异常:
except
还可以同时接收多个异常,需在except
后加圆括号(),再将多个异常作为参数传入。
1# except语句可以同时接受多个异常。
2try:
3 char = 'ABCDEF'
4 num = eval(input('请输入一个数字:'))
5 print(char[num])
6except (NameError , IndexError):
7 print('输入错误,请重新输入!')
8except:
9 print('发生其他错误!')
当输入数字超出字符串长度时发生IndexError
异常,程序输出结果如下:
1请输入一个数字:11
2输入错误,请输入小于6的数字!!
2.3 与else、finally配合使用:
try-except
语句还可以与else
、finally
配合使用,基本用法如下所示: 1try:
2 <语句块1>
3except <异常类型1>:
4 <语句块2>
5...
6except <异常类型n>:
7 <语句块n+1>
8else:
9 <语句块n+2>
10finally:
11 <语句块n+3>
当try
中的语句块正常执行结束且没有发生异常时,else中的语句会被执行。无论try中的语句块是否正常执行,finally中的语句块都会执行。
在复杂的程序中,在代码没有运行之前,并不知道会进入哪个异常分支,这样很容易出现由于资源不释放导致的资源或内存泄漏问题。为了解决这一问题,一般会在最后加上finally语句,在finally语句中会对资源或者内存进行统一的清理。
1# try-except语句与else、finally配合使用
2
3try:
4 char = 'ABCDEF'
5 num = eval(input('请输入一个数字:'))
6 print(char[num])
7except NameError:
8 print('输入错误,请输入数字!')
9except IndexError:
10 print('输入错误,请输入小于6的数字!')
11else:
12 print('程序没有发生异常!')
13finally:
14 print('不管发没发生异常,程序都会执行!')
当输入没有错误时,程序输入结果为:
1请输入一个数字:2
2C
3程序没有发生异常!
4不管发没发生异常,程序都会执行!
当输入有错误时,程序输入结果为:
1请输入一个数字:11
2输入错误,请输入小于6的数字!
3不管发没发生异常,程序都会执行!
但是当程序较复杂时,往往很难预测会有什么异常发生,此时就需要让程序输出未知异常。
1try:
2 char = 'ABCDEF'
3 num = eval(input('请输入一个数字:'))
4 print(char[num])
5except Exception as e:
6 print(e)
1请输入一个数字:11
2string index out of range
try-except
这种异常处理机制。
3.标准异常:
Python中内置了一些常见的异常,称作标准异常。
异常名称 | 描述 |
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器发生异常,通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
本篇文章来源于微信公众号: 码农设计师