Python异常知多少

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python异常知多少相关的知识,希望对你有一定的参考价值。

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

1.什么是异常

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

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

2.异常的作用

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

错误处理

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

时间通知

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

终止运行

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

3.异常与错误

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

Print("你好!")

报错:

Python异常知多少_抛出异常

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

Python异常知多少_程序运行_02

while True print(Hello world)

报错:

Python异常知多少_抛出异常_03

这个是语法格式错误.

input(请输入内容:)

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

Python异常知多少_程序运行_04

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

错误:

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

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

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

异常:

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

4.异常处理

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

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

try:
input(请输入内容:)
except EOFError: #捕捉EOFError
print("输入错误")
else:
print("输入正确")

print("继续...")

输出结果:

Python异常知多少_抛出异常_05

Python异常知多少_python_06

上面的例子使用了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")

运行结果:

Python异常知多少_程序运行_07

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

Python异常知多少_抛出异常_08

6.finally语句

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

try:
input("请输入:")

finally:
print("结束")

print("程序完成")

运行结果:

Python异常知多少_抛出异常_09

使用finally文件关闭:

file = open(./test.txt, w)
try:
file.write(你好)
finally:
file.close()

使用with:

with open(./test.txt, w) as file:
file.write(你好)

总结

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

以上是关于Python异常知多少的主要内容,如果未能解决你的问题,请参考以下文章

纯纯的爬虫知识,python scrapy 下载中间件知多少

Python–logging模块知多少

Python 进程线程协程锁机制,你知多少?

哈希情史知多少

Python格式化字符串知多少

python文件操作知多少?