类比 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