CodeGym /课程 /Python SELF ZH /异常抛出

异常抛出

Python SELF ZH
第 18 级 , 课程 0
可用

6.1 有意抛出异常

在 Python 中,你可以使用 raise 语句有意抛出异常。这允许你在程序中标识错误或不正常的情况。让我们看看使用 raise 和重新包装异常的各种方式。

抛出标准异常

这样操作的一般语法是:


raise 异常

你可以通过传递相应的消息抛出标准异常,如 ExceptionTypeError 等。

示例: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: 检测到空变量

第一个错误(绿色标记) 是在代码内部深处发生的原始错误。有时候这样的错误会时不时地出现,这属于程序的正常行为。

第二个错误(蓝色标记) 已经是一个更高层次的错误。你的程序或框架应该知道如何处理它。如果你想更深入地了解错误发生的原因,那么绿色的错误信息将对你有所帮助。

这一切都很合理。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION