在 Python 中,raise
和 assert
是用于处理和控制错误的两个关键字。它们在编写健壮且易于调试的代码时非常有用。
raise
raise
关键字用于显式地引发异常。你可以在代码中使用 raise
来引发一个指定的异常,并附带一个描述性的信息。
示例
- 基本使用:
1 2 3 4 5 6 7 8 9 |
def divide(x, y): if y == 0: raise ZeroDivisionError("除数不能为零") return x / y try: result = divide(10, 0) except ZeroDivisionError as e: print(f"捕获到异常: {e}") |
输出:
1 |
捕获到异常: 除数不能为零 |
- 自定义异常:
你还可以定义自己的异常类型。
1 2 3 4 5 6 7 8 9 10 11 |
class CustomError(Exception): pass def do_something(value): if value < 0: raise CustomError("值不能为负数") try: do_something(-1) except CustomError as e: print(f"捕获到自定义异常: {e}") |
输出:
1 |
捕获到自定义异常: 值不能为负数 |
assert
assert
关键字用于进行调试性检查。它后面跟一个表达式,如果表达式的值为假(即 False
),则触发一个 AssertionError
异常,并可以选择性地包含一条错误消息。
示例
- 基本使用:
1 2 3 4 5 6 7 8 |
def divide(x, y): assert y != 0, "除数不能为零" return x / y try: result = divide(10, 0) except AssertionError as e: print(f"捕获到断言错误: {e}") |
输出:
1 |
捕获到断言错误: 除数不能为零 |
- 调试代码:
断言常用于在开发和测试阶段检查代码的正确性。
1 2 3 4 5 6 7 8 |
def test_function(x): assert x > 0, "x 应该是正数" return x * 2 try: result = test_function(-1) except AssertionError as e: print(f"捕获到断言错误: {e}") |
输出:
1 |
捕获到断言错误: x 应该是正数 |
区别和用法
raise
:- 用于显式地引发异常,以便在运行时处理错误条件。
- 常用于代码中发生异常情况时,如非法操作或逻辑错误。
assert
:- 用于在开发和调试阶段进行内部检查。
- 在生产环境中通常会被禁用(通过运行 Python 解释器时使用
-O
选项),因此不应依赖assert
进行关键的运行时检查。
示例总结
使用 raise
引发异常
1 2 3 4 5 6 7 8 9 |
def check_age(age): if age < 0: raise ValueError("年龄不能为负数") return age try: age = check_age(-5) except ValueError as e: print(f"捕获到异常: {e}") |
输出:
1 |
捕获到异常: 年龄不能为负数 |
使用 assert
进行断言
1 2 3 4 5 6 7 8 |
def check_age(age): assert age >= 0, "年龄不能为负数" return age try: age = check_age(-5) except AssertionError as e: print(f"捕获到断言错误: {e}") |
输出:
1 |
捕获到断言错误: 年龄不能为负数 |
通过理解和合理使用 raise
和 assert
,可以编写出更健壮和更易于维护的代码。