6.1 有意抛出异常
在 Python 中,你可以使用 raise
语句有意抛出异常。这允许你在程序中标识错误或不正常的情况。让我们看看使用 raise
和重新包装异常的各种方式。
抛出标准异常
这样操作的一般语法是:
raise 异常
你可以通过传递相应的消息抛出标准异常,如 Exception
,TypeError
等。
示例:raise Exception
def check_number(value):
if value < 0:
raise Exception("不好意思,不允许负数")
try:
check_number(-5)
except Exception as e:
print(f"捕获异常: {e}")
在这个例子中,如果值小于零,则会抛出Exception
,消息为 "不好意思,不允许负数"
。
示例:raise TypeError
def check_integer(value):
if not isinstance(value, int):
raise TypeError("只允许整数")
try:
check_integer("string")
except TypeError as e:
print(f"捕获异常: {e}")
在这个例子中,如果值不是整数,则会抛出TypeError
,消息为 "只允许整数"
。
6.2 异常重新包装
有时需要捕获一个异常并抛出另一个异常,以提供更具体或有用的信息。这可以通过raise
... from
语句实现,它保留了原始异常作为新异常的原因。
这种操作的一般语法是:
raise 新异常 from 旧异常
示例:异常重新包装
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("变量为空")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("检测到空变量") from e
在这个例子中,如果变量的值为空,首先会抛出ValueError
,消息为"变量为空"
。这个异常然后被捕获,并抛出新的异常EmptyVariableError
,消息为"检测到空变量"
,同时通过from
传递原始异常。
6.3 分析重新包装的异常
使用raise
... from
语句允许保留异常链的信息,这在调试时可能非常有用。你可以分析重新包装的异常及其原因。
重新包装异常分析示例:
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("变量为空")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("检测到空变量") from e
运行上述代码将产生以下输出:
Traceback (most recent call last):
File "example.py", line 8, in
check_non_empty("")
File "example.py", line 5, in check_non_empty
raise ValueError("变量为空")
ValueError: 变量为空
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "example.py", line 10, in
raise EmptyVariableError("检测到空变量") from e
EmptyVariableError: 检测到空变量
第一个错误(绿色标记)
是在代码内部深处发生的原始错误。有时候这样的错误会时不时地出现,这属于程序的正常行为。
第二个错误(蓝色标记)
已经是一个更高层次的错误。你的程序或框架应该知道如何处理它。如果你想更深入地了解错误发生的原因,那么绿色的错误信息将对你有所帮助。
这一切都很合理。
GO TO FULL VERSION