你现在的位置: 首页 > 深入 Python > 异常和文件处理 | << >> | ||||
深入 Python从 Python 新手到专家 |
在本章中,您将深入了解异常、文件对象、for 循环以及 os 和 sys 模块。如果您在其他编程语言中使用过异常,则可以浏览第一部分以了解 Python 的语法。请务必再次收听文件处理部分。
与许多其他编程语言一样,Python 通过 try...except 块进行异常处理。
![]() |
|
Python 使用 try...except 处理异常,并使用 raise 生成异常。Java 和 C++ 使用 try...catch 处理异常,并使用 throw 生成异常。 |
异常在 Python 中无处不在。标准 Python 库中的几乎每个模块都使用它们,并且 Python 本身会在许多不同的情况下引发它们。在本书中,您已经多次看到它们。
在每种情况下,您都只是在 Python IDE 中玩耍:发生错误,打印异常(取决于您的 IDE,可能是有意 jarring 的红色阴影),仅此而已。这称为 未处理 异常。引发异常时,没有代码可以明确注意到它并处理它,因此它会冒泡回到 Python 中内置的默认行为,即吐出一些调试信息并放弃。在 IDE 中,这没什么大不了的,但是如果在您的实际 Python 程序运行时发生这种情况,整个程序就会突然停止。
但是,异常并不一定会导致程序完全崩溃。引发异常时,可以 处理 异常。有时,异常确实是因为您的代码中存在错误(例如访问不存在的变量),但很多时候,异常是您可以预料到的。如果您要打开一个文件,它可能不存在。如果您要连接到数据库,则数据库可能不可用,或者您可能没有正确的安全凭据来访问它。如果您知道某行代码可能会引发异常,则应使用 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, TERMIOSexcept 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 | |
使用文件对象 >> |