Python入门(二十五)异常(二)

1.else代码块

通过将可能引发错误的代码放在try-except代码块中,可提高程序抵御错误的能力。错误是执行除法运算的代码行导致的,因此需要将它放到try-except代码块中。这个示例还包含一个else代码块。依赖try代码块成功执行的代码都应放到else代码块中:

  --snip--
  while True:
      --snip--
      if second_number == 'q':
          breaktry:
          answer = int(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: 0
You can't divide by 0!

First number: 5
Second number: 2
2.5

First number: q

try-except-else代码块的工作原理大致如下。Python尝试执行try代码块中的代码,只有可能引发异常的代码才需要放在try语句中。有时候,有一些仅在try代码块成功执行时才需要运行的代码,这些代码应放在else代码块中。except代码块告诉Python,如果尝试运行try代码块中的代码时引发了指定的异常该怎么办。

通过预测可能发生错误的代码,可编写健壮的程序。它们即便面临无效数据或缺少资源,也能继续运行,从而抵御无意的用户错误和恶意的攻击。

2.处理FileNotFoundError异常

使用文件时,一种常见的问题是找不到文件:查找的文件可能在其他地方,文件名可能不正确,或者这个文件根本就不存在。对于所有这些情形,都可使用try-except代码块以直观的方式处理。

我们来尝试读取一个不存在的文件。下面的程序尝试读取文件alice.txt的内容,但该文件没有存储在alice.py所在的目录中:

filename = 'alice.txt'

with open(filename, encoding='utf-8') as f:
    contents = f.read()

相比于本章前面的文件打开方式,这里有两个不同之处。一是使用变量f来表示文件对象,这是一种常见的做法。二是给参数encoding指定了值,在系统的默认编码与要读取文件使用的编码不一致时,必须这样做。

Python无法读取不存在的文件,因此它引发一个异常:

Traceback (most recent call last):
  File "alice.py", line 3, in <module>
    with open(filename, encoding='utf-8') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'alice.txt'

上述traceback的最后一行报告了FileNotFoundError异常,这是Python找不到要打开的文件时创建的异常。在本例中,这个错误是函数open()导致的。因此,要处理这个错误,必须将try语句放在包含open()的代码行之前:

filename = 'alice.txt'

try:
    with open(filename, encoding='utf-8') as f:
        contents = f.read()
except FileNotFoundError:
    print(f"Sorry, the file {filename} does not exist.")

在本例中,try代码块引发了FileNotFoundError异常,因此Python找到与该错误匹配的except代码块,并运行其中的代码。最终的结果是显示一条友好的错误消息,而不是traceback:

Sorry, the file alice.txt does not exist.

如果文件不存在,这个程序就什么都做不了,错误处理代码也意义不大。下面来扩展这个示例,看看在你使用多个文件时,异常处理可提供什么样的帮助。

3.决定报告哪些错误

该在什么情况下向用户报告错误?又该在什么情况下静默失败呢?如果用户知道要分析哪些文件,他们可能希望在有文件却没有分析时出现一条消息来告知原因。如果用户只想看到结果,并不知道要分析哪些文件,可能就无须在有些文件不存在时告知他们。向用户显示他不想看到的信息可能会降低程序的可用性。Python的错误处理结构让你能够细致地控制与用户分享错误信息的程度,要分享多少信息由你决定。

编写得很好且经过详尽测试的代码不容易出现内部错误,如语法或逻辑错误,但只要程序依赖于外部因素,如用户输入、存在指定的文件、有网络链接,就有可能出现异常。凭借经验可判断该在程序的什么地方包含异常处理块,以及出现错误时该向用户提供多少相关的信息。

posted @ 2023-06-18 14:39  小幽余生不加糖  阅读(5)  评论(0编辑  收藏  举报  来源