写点什么

Python 异常知多少

作者:迷彩
  • 2022 年 7 月 18 日
  • 本文字数:2147 字

    阅读完需:约 7 分钟

我们在编写程序的时候或多或少都出现过异常,也许是不小心,也可能是逻辑错误亦或是程序以外的问题,比如环境的问题,不管是什么原因,异常是我们不希望看到的.接下来,我们就什么是异常,遇到异常如何解决展开唠唠


1.什么是异常


异常会让我们的程序跳出正常的运行,异常给我们带来的损失,不容小觑.我们经常听到的是机器的异常.比如工厂流水线上的机器设备,某个零件出问题了,机器不能正常运行或者生产流程错乱;快递分拣设备传送带出现断裂,或者电机出现问题不能正常分拣;还有我们现在最火的自动驾驶汽车,如果汽车在路上行驶时雷达失灵.程序错乱.摄像头设备无法正常检测识别,等等.这些都是异常.如果不能快速排除异常,不但会导致生产停滞,还威胁到生命安全,会造成很大的损失.

上述情况正是异常要做的,我们可以在恰当的地方添加异常.若是出现例外,终止流程进入异常管理.在异常管理器中完成对当前异常的处理,让流程维持在正常的轨道上.


2.异常的作用


上面我们了解了什么是异常,但在程序中,异常的作用不仅仅只是用于排除例外.异常具体的作用如下:

错误处理

在程序运行中发生错误时,python 会向外抛出异常,Python 中有默认的异常处理机制,他会停止程序运行,打印错误信息,我们还可以自己捕捉异常并从异常中恢复.

时间通知

异常也可以用于向外抛出程序的状态信息


终止运行

使用 Python 的 try/finally 语句可以确保无论是否有异常都会执行 finally 中的语句


3.异常与错误


异常和错误是不一样的,即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。下面我们通过例子来说明;

Print("你好!")
复制代码

报错:

从报错中可以看出,是 Print 没有定义,也就是不存在 Print 这样一个函数,Python 中是区分大小写的.打印函数正确的是 print().除非你自定义一个 Print()函数.其实如果你使用 PyCharm 去编写代码,你写来未运行就已经提示错误,如图:


while True print('Hello world')
复制代码

报错:

这个是语法格式错误.


input('请输入内容:')
复制代码

上面的代码本身没有错误,但是在输入的时候,此时我们按下 Ctrl+D 键,这是一个文件结束符号.但是它不应该出现在这里,所以 Python 就会抛出异常.并指出这是一个 EOFError,使用 Python 默认的处理方式,立即终止程序.

异常和错误有什么区别呢:

错误:

错误可分为语法错误和逻辑错误

语法错误说明代码不符合语言的语法规范

逻辑错误说明代码编写逻辑上的错误,程序不会报错但是执行的结果不符合预期


异常:

程序是可以运行的,但是在运行过程中遇到错误会导致程序意外退出


4.异常处理

如果是语法的错误,程序本身是无法执行的,我们是无法从程序抛出的异常去处理的,只能调整代码本身.但是异常是在程序运行过程中可能出现的,我们可以通过捕捉可能出现的异常并加以处理,保持程序正常运行;

上面 input()的异常我们可以捕捉并处理:

try:    input('请输入内容:')except EOFError: #捕捉EOFError    print("输入错误")else:    print("输入正确")
print("继续...")
复制代码

输出结果:



上面的例子使用了 try...except.当 try 语句用于捕获异常并从中恢复时,至少要有一句 except 与之对应,因为仅仅抛出异常是没有用的.如果异常没有被处理.那么 Python 就会调用默认的处理方式,停止执行并在终端打印出错误信息.

5.常见异常

OverflowError:数值超出最大限制,比如数组下标越界

ZeroDivisionError:除(或取模)零

OSError:操作系统错误

StopIteration:迭代器没有更多的值

FloatingPiontError:浮点计算错误

IOError:输入/输出操作失败

MemoryError:内存溢出错误(对于解释器不是致命的)\

EOFError:没有内建输入到达 EOF 标记


以上这些对于编程中的复杂环境来说还是不够的.因此 Python 允许我们自己定义异常类型并且通过 raise 语句来引发;我们要注意的是,自定义的异常必须是直接或间接从属于 Exception 类的派生类.

下面通过模拟车辆无油状态的提示体验一下:

#模拟车辆无油class NoGas(Exception):    def __init__(self, state):        Exception.__init__(self)        self.state = state        state  = "无油"
try: if state != "yes": raise NoGas(state)except NoGas as ng: print("油表显示状态: {0},正在检测..".format(state)) print("正在加油!") print("加油完成!")finally: print("若加完油,车辆可继续行驶\n")
复制代码

运行结果:

finally 语句不管 try 里面代码发生了什么都会执行.


6.finally 语句

finally 语句一定会在最后执行,所以 finally 语句也被称为终止行为或者是清理语句,我们在操作文件的时候一般会把 File.close()关闭文件的语句放到 finally,保证程序运行完必须关闭打开的文件,或者使用 with 语句来保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法,其实 with 也是封装了 try…except…finally 编码范式,提高了易用性


try:    input("请输入:")
finally: print("结束")
print("程序完成")
复制代码

运行结果:

使用 finally 文件关闭:

file = open('./test.txt', 'w')try:    file.write('你好')finally:    file.close()
复制代码

使用 with:

with open('./test.txt', 'w') as file:    file.write('你好')
复制代码

总结

异常是一种比较高级的控制流设备.他可能是由 Python 引发,也有可能是由程序本身引起.在写代码时要先分析并选取异常条件.这里只是抛转引玉,还有更多异常有关的使用场景等你发掘.异常的处理在开发中是非常重要的一环,一定要熟练掌握异常机制的应用

发布于: 21 小时前阅读数: 39
用户头像

迷彩

关注

我的工作是常年写bug|公众号:编程架构之美 2020.06.18 加入

修bug的菜鸟~公众号:“互联网有啥事”已改名为“编程架构之美”

评论

发布
暂无评论
Python异常知多少_Python_迷彩_InfoQ写作社区