导航: 起始页 > Dive Into Python > 异常和文件处理 | << >> | ||||
Python 研究(Dive Into Python)Python 从新手到高手 [DIP_5_4_CPUG_RELEASE] |
在本章中, 将研究异常, 文件对象, for 循环, os 和 sys 模块等内容。 如果你已经在其它编程语言中使用过异常, 你可以简单看看第一部分来了解 Python 的语法。 但是本章其它的内容仍需仔细研读。
与许多面向对象语言一样,Python 具有异常处理,通过使用 try...except 块来实现。
Python 使用 try...except 来处理异常,使用 raise 来引发异常。 Java 和 C++ 使用 try...catch 来处理异常,使用 throw 来引发异常。 |
异常在 Python 中无处不在;实际上在标准 Python 库中的每个模块都使用了它们,并且 Python 自已会在许多不同的情况下引发它们。在整本书中你已经再三看到它们了。
在这些情况下,我们都在简单使用 Python IDE:一个错误发生了,异常被打印出来 (根据你的 IDE,有意地以一种刺眼的红色形式表示),这便是。这叫做 未处理 异常;当异常被引发时,没有代码来明确地关注和处理它,所以异常被传给置在 Python 中的缺省的处理,它会输出一些调试信息并且终止运行。在 IDE 中,这不是什么大事,但是如果发生在你真正的 Python 程序运行的时候,整个程序将会终止。
然而,一个异常不一定会引起程序的完全崩溃。当异常引发时,可以被 处理 掉。有时候一个异常实际是因为代码中的 bug (比如使用一个不存在的变量),但是许多时候,一个异常是可以预计的。如果你打开一个文件,它可能不存在。如果你连接一个数据库,它可能不可连接或没有访问所需的正确的安全证书。如果知道一行代码可能会引发异常,你应该使用一个 try...except 块来处理异常。
>>> fsock = open("/notthere", "r") Traceback (innermost last): File "<interactive input>", line 1, in ? IOError: [Errno 2] No such file or directory: '/notthere' >>> try: ... fsock = open("/notthere") ... except IOError: ... print "The file does not exist, exiting gracefully" ... print "This line will always print" The file does not exist, exiting gracefully This line will always print
异常可能看上去不友好 (毕竟,如果你不捕捉异常,整个程序将崩溃),但是考虑一下别的方法。你希望获得一个没有用的文件对象而不是一个不存在的文件吧?不管怎么样你都得检查它的有效性,而且如果你忘记了,你的程序将会在下面某个地方给出奇怪的错误,这样你将不得不追溯到源程序。我确信你做过这种事;这可并不有趣。使用异常,一发生错误,你就可以在问题的源头通过标准的方法来处理它们。
除了处理实际的错误条件之外,对于异常还有许多其它的用处。在标准 Python 库中一个普通的用法就是试着导入一个模块,然后检查是否它能使用。导入一个并不存在的模块将引发一个 ImportError 异常。你可以使用这种方法来定义多级别的功能,依靠在运行时哪个模块是有效的,或支持多种平台 (即平台特定代码被分离到不同的模块中)。
你也能通过创建一个从内置的 Exception 类继承的类定义你自己的异常, 然后使用 raise 命令引发你的异常。如果你对此感兴趣,请看进一步阅读的部分。
下面的例子演示了如何使用异常支持特定平台功能。 代码来自 getpass 模块, 一个从用户获得口令的封装模块。获得口令在 UNIX, Windows 和 Mac OS 平台上的实现是不同的,但是这个代码封装了所有的不同之处。
# Bind the name getpass to the appropriate function try: import termios, TERMIOS except ImportError: try: import msvcrt except ImportError: try: from EasyDialogs import AskPassword except ImportError: getpass = default_getpass else: getpass = AskPassword else: getpass = win_getpass else: getpass = unix_getpass
<< 小结 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
与文件对象共事 >> |