python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python异常处理

Python中的代码异常处理你掌握了吗

作者:数据STUDIO

Python 使用称为异常(exception)的特殊对象来管理程序执行期间发生的错误,那Python中代码异常处理的相关操作你都了解了吗,本文为大家进行了详细整理,需要的可以参考下

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异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文