类比 java 学习
python 中的异常处理和 java 基本上是一模一样。
模板
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except ZeroDivisionError:
print("Unexpected error:", sys.exc_info()[0])
raise
else:
print("other case")
finally:
print("I will be always called")
python 有一个特殊的 else,相当于是不属于当前的异常情况下的其他处理。
抛出异常
raise
类似 java 中的 throw
自定义异常
程序可以通过创建新的异常类来命名它们自己的异常。
异常通常应该直接或间接地从 Exception
类派生。
可以定义异常类,它可以执行任何其他类可以执行的任何操作,但通常保持简单,通常只提供许多属性,这些属性允许处理程序为异常提取有关错误的信息。
在创建可能引发多个不同错误的模块时,通常的做法是为该模块定义的异常创建基类,并为不同错误条件创建特定异常类的子类:
例子
class Error(Exception):
"""Base class for exceptions in this module."""
pass
class InputError(Error):
"""Exception raised for errors in the input.
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
"""Raised when an operation attempts a state transition that's not
allowed.
Attributes:
previous -- state at beginning of transition
next -- attempted new state
message -- explanation of why the specific transition is not allowed
"""
def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
标准和建议
大多数异常都定义为名称以 Error
结尾,类似于标准异常的命名。
许多标准模块定义了它们自己的异常,以报告它们定义的函数中可能出现的错误。
资源的关闭(预处理)
java 的资源处理
在 java 中,很多 IO 资源文件都需要我们去手动关闭。
后来 jdk1.7 之后引入了 TWR 方式,才大大降低了出错的问题。
python
python 这一点就做的非常好。
某些对象定义了在不再需要该对象时要执行的标准清理操作,无论使用该对象的操作是成功还是失败。请查看下面的示例,它尝试打开一个文件并把其内容打印到屏幕上。:
for line in open("myfile.txt"):
print(line, end="")
这个代码的问题在于,它在这部分代码执行完后,会使文件在一段不确定的时间内处于打开状态。
python with 语句
这在简单脚本中不是问题,但对于较大的应用程序来说可能是个问题。
with
语句允许像文件这样的对象能够以一种确保它们得到及时和正确的清理的方式使用。
with open("myfile.txt") as f:
for line in f:
print(line, end="")
执行完语句后,即使在处理行时遇到问题,文件 f 也始终会被关闭。和文件一样,提供预定义清理操作的对象将在其文档中指出这一点。
参考资料
https://docs.python.org/zh-cn/3/tutorial/errors.html
- 断言
https://www.tutorialspoint.com/python/assertions_in_python.htm