首页Python【Python基础】16....

【Python基础】16.程序的异常处理


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Basic/lab/index.html
链接: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语句还可以与elsefinally配合使用,基本用法如下所示:
 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语句中会对资源或者内存进行统一的清理。

 1try-except语句与elsefinally配合使用
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不管发没发生异常,程序都会执行!
2.4 输出未知异常:

上述代码示例均是直接捕获指定的异常类型名称,以完成异常处理。

但是当程序较复杂时,往往很难预测会有什么异常发生,此时就需要让程序输出未知异常。

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
Python能识别多种异常类型,但是不建议在编写程序时过度依赖

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 用户代码生成的警告


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments