Python 使用称为异常(exception)的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个 traceback,其中包含有关异常的报告。
异常是使用 try-except 代码块处理的。try-except 代码块让 Python 执行指定的操作,同时告诉 Pysthon 在发生异常时应该怎么办。在使用 try-except 代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的 traceback。
处理 ZeroDivisionError 异常
下面来看一种导致 Pyton 引发异常的简单错误。你可能知道不能将数除以人 0,但还是让Python试试看吧:
print(5/0)
Python 无法这样做,因此你将看到一个 traceback:
Traceback (most recent call last):
File "division calculator.py", line 1, in <module>
print(5/0)
~^~
①ZeroDivisionError: division by zero
在上述traceback 中,错误 ZeroDivisionError 是个异常对象(见①)。Python 在无法按你的要求做时,就会创建这种对象。在这种情况下,Python 将停止运行程序,并指出引发了哪种异常,而我们可根据这些信息对程序进行修改。下面将告诉Python,在发生这种错误时该怎么办。这样,如果再次发生这样的错误,我们就有所准备了。
使用 try-except 代码块
当你认为可能发生错误时,可编写一个 try-except 代码块来处理可能引发的异常。你让 Python 尝试运行特定的代码,并告诉它如果这些代码引发了指定的异常,该怎么办。
处理 zeroDivisionError 异常的 try-except 代码块类似于下面这样:
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
这里将导致错误的代码行 print(5/0)放在一个try 代码块中。如果 try代码块中的代码运行起来没有问题,Python 将跳过 except 代码块;如果 try 代码块中的代码导致错误,Python将查找与之匹配的 except 代码块并运行其中的代码。
在这个示例中,try 代码块中的代码引发了 ZeroDivisionError 异常,因此 Python 查找指出了该怎么办的 except 代码块,并运行其中的代码。这样,用户看到的是一条友好的错误消息,而不是 traceback:
You can'+ divide by zero!
如果 try-except 代码块后面还有其他代码,程序将继线运行,因为Python已经知道了如何处理错误。下面來看一个在捕获错误后让程序继续运行的示例。
使用异常避免崩溃
如果在错误发生时,程序还有工作没有完成,妥善地处理错误就显得尤其重要。这种情况经當出现在要求用户提供输人的程序中。如果程序能够妥善地处理无效输人,就能提不用户提供有效输人,而不至于崩溃。
下面来创建一个只执行除法运算的简单计算器:
print("Give me two numbers, and I'll divide them.")
print("Enter 'g' to quit.")
while True:
① first number = input ("First_number: ")
if first number == 'q':
break
② second_number = input("Second_number: ")
if second number == 'q':
break
③ answer = int(first_number) / int(second_number)
print(answer)
在①处,程序提示用户输人一个数,并将其赋给变量 first_number。如果用户输人的不是表示退出的9,就再提示用户输人一个数,并将其赋给变量 second_ number(见②)。接下来,计算这两个数的商(见③)。这个程序没有采取任何处理错误的措施,因此在执行除数为 0 的除法运算时,它将崩溃:
Give me two numbers, and I'll divide them.
Enter 'q' to quit.
First number: 5
Second number: 0
Traceback (most recent call last):
File "division_calculator.py", line 11, in <module>
answer = int (first number) / int(second number)
~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
ZeroDivisionError: division by zero
程序崩溃可不好,让用户看到 traceback 也不是个好主意。不懂技术的用户会感到糊涂,怀有恶意的用户还能通过 traceback 获悉你不想让他们知道的信息。例如,他们将知道你的程序文件的名称,还将看到部分不能正确运行的代码。有时候,训练有素的攻击者可根据这些信息判断出可对你的代码发起什么样的攻击。
else 代码块
通过将可能引发错误的代码放在 try-except 代码块中,可提高程序抵御错误的能力。因为错误是执行除法运算的代码行导致的,所以需要将它放到 try-except 代码块中。这个示例还包含一个else 代码块,只有try代码块成功执行才需要继续执行的代码,都应放到else代码块中:
--snip--
while True:
--Ship--
if second number == 'g':
break
① try:
answer = in(first _number) / int (second _number)
② except ZeroDivisionError:
print("You can't divide by 0!")
③ else:
print(answer)
我们让Python 尝试执行 try代码块中的除法运算(见①),这个代码块只包含可能导致错误的代码。依赖 try 代码块成功执行的代码都被放在else 代码块中。在这个示例中,如果除法运算成功,就使用else 代码块来打印结果(见③)。
except 代码块告诉 Python,在出现 zeroDivisionError 异常时该怎么办(见②)。如果try代码块因零除错误而失败,就打印一条友好的消息,告诉用户如何避免这种错误。程序会继续运行,而用户根本看不到 traceback:
Give me two numbers, and I'll divide them.
Enter 'q' to quit.
First number: 5
Second number: O
You can't divide by 0!
First number: 5
Second number: 2
2.5
First number: q
只有可能引发异常的代码才需要放在try 语向中。有时候,有一些仅在try 代码块成功执行时才需要运行的代码,这些代码应放在else 代码块中。except 代码块告诉 Python,如果在尝试运行 try代码块中的代码时引发了指定的异常该怎么办。
通过预测可能发生错误的代码,可编与稳健的程序。它们即便面临无效数据或缺少资源,也能继续运行,不受无意的用户错误和恶意攻击的影响。
静默失败
在上一个示例中,我们告诉用户有一个文件找不到。但并非每次捕获异常都需要告诉用户,从有时候希望程序在发生异常时保持静默,就像什么都没有发生一样继续运行。要让程序静默失败,可像通常那样编写 try 代码块,但在except 代码块中明确地告诉Python什么都不要做。
Python有一个pass 语句,可在代码块中使用它来让Python什么都不做:
def count words (path) :
"""计算一个文件大致包含多少个单词"""
try:
~~ship~~
except FileNotFoundError:
pass
else:
~~snip~~
相比于上一个程序,这个程序唯一的不同之处是,except 代码块包含一条pass语句。现在,当出现 FileNotFoundError 异常时,虽然仍将执行 except 代码块中的代码,但什么都不会发生。当这种错误发生时,既不会出现 traceback,也没有任何输出。用户将看到存在的每个文件包含多少个单词,但没有任何迹象表明有一个文件未找到:
The file alice.txt has about 29594 words .
The file moby dick. txt has about 215864 words .
The file little women.txt has about 189142 words.
pass 语向还充当了 占位符,提醒你在程序的某个地方什么都没有做,而且以后地许要在这型水世什么。例如,在这个程序中,我们可能决定特找不到的文件的台称写人文什missing_fles.txt。虽然用户看不到这个文件,但我们可以读取它。进而处理所有找不到文件的回题。
决定报告哪些错误
该在什么情况下向用户报告错误?又该在什么情况下静默失败呢?如果用户知道要分析哪些文件,他们可能希望在有文件未被分析时出现一条消息来告知原因。如果用广只想看到结果,并不知道要分析哪些文件,可能就无须在有些文件不存在时告知他们。向用户显示他们不想看到的信息可能会降低程序的可用性。Python 的错误处理结构让你能够细致地控制与用户共享错误信息的程度,要共享多少信息由你决定。
编写得很好且经过恰当测试的代码不容易出现内部错误,如语法错误和逻辑错误,但只要程序依赖于外部因素,如用户输人、是否存在指定的文件、是否有网络连接,就有可能出现异器。凭借经验可判断该在程序的什么地方包含昇常处理块,以及出现错误时该向用户提供多少相关的信息。
关于Python学习指南
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
👉Python所有方向的学习路线👈
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python70个实战练手案例&源码👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉Python大厂面试资料👈
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉Python副业兼职路线&方法👈
学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。
👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费
】