在 Python 中,raise
语句用于显式地引发异常。通过 raise
,你可以在程序中主动触发异常,以便在特定条件下中断程序的正常执行流程,并转移到异常处理逻辑。
基本语法
raise
语句的基本语法如下:
raise [ExceptionType([message])]
ExceptionType
是你要引发的异常类型,通常是内置的异常类(如ValueError
、TypeError
等)或自定义的异常类。message
是一个可选的字符串,用于描述异常的详细信息。
引发内置异常
def divide(a, b):
if b == 0:
raise ZeroDivisionError("Division by zero is not allowed")
return a / b
try:
result = divide(10, 0)
except ZeroDivisionError as e:
print(f"Caught an exception: {e}")
输出:
Caught an exception: Division by zero is not allowed
引发自定义异常
你可以定义自己的异常类,并在需要时引发它。
class MyCustomError(Exception):
pass
def check_value(value):
if value < 0:
raise MyCustomError("Negative value is not allowed")
try:
check_value(-1)
except MyCustomError as e:
print(f"Caught a custom exception: {e}")
输出:
Caught a custom exception: Negative value is not allowed
重新引发异常
在异常处理块中,你可以使用 raise
重新引发捕获的异常,以便在更高层次的代码中进一步处理。
def process_data(data):
try:
result = int(data)
except ValueError as e:
print(f"Error converting data: {e}")
raise # 重新引发异常
try:
process_data("abc")
except ValueError as e:
print(f"Caught an exception in outer block: {e}")
输出:
Error converting data: invalid literal for int() with base 10: 'abc'
Caught an exception in outer block: invalid literal for int() with base 10: 'abc'
引发异常并附带原始异常信息
在 Python 3 中,你可以使用 raise ... from ...
语法链式引发异常,并保留原始异常信息。
def process_data(data):
try:
result = int(data)
except ValueError as e:
raise RuntimeError("Failed to process data") from e
try:
process_data("abc")
except RuntimeError as e:
print(f"Caught an exception: {e}")
print(f"Original exception: {e.__cause__}")
输出:
Caught an exception: Failed to process data
Original exception: invalid literal for int() with base 10: 'abc'
总结
raise
语句:用于显式地引发异常。- 内置异常:可以引发 Python 内置的异常类型,如
ValueError
、TypeError
等。 - 自定义异常:可以定义并引发自定义的异常类型。
- 重新引发异常:在异常处理块中可以使用
raise
重新引发捕获的异常。 - 链式引发异常:使用
raise ... from ...
语法链式引发异常,并保留原始异常信息。