在 Python 中,异常是通常是通过 try
和 except
语句来处理的。
下面是一个简单的例子,展示了如何使用这些语句来处理异常:
def divide(a, b):
try:
result = a / b
except ZeroDivisionError:
print("division by zero!")
else:
print(f"result is {result}")
finally:
print("executing finally clause")
divide(2, 1)
# Output: result is 2.0
# executing finally clause
divide(2, 0)
# Output: division by zero!
# executing finally clause
divide("2", "1")
# Output: executing finally clause
# TypeError: unsupported operand type(s) for /: 'str' and 'str'
在这个例子中,我们定义了一个函数 divide
,它接受两个参数 a
和 b
并尝试做除法运算。
在 try
块中,我们执行除法运算并将结果存储在变量 result
中。如果这个运算出现了 ZeroDivisionError
异常,那么程序会跳转到 except
块中并打印一条消息。如果没有异常发生,那么程序会跳转到 else
块中并打印结果。最后,finally
块中的代码总是会执行,无论是否发生了异常。
注意,在最后一个例子中,我们尝试将字符串相除,这会导致另一种类型的异常——TypeError
。由于没有为这种类型的异常提供处理程序,因此程序会中止并显示错误消息。
你可以使用多个 except
语句来处理不同类型的异常,例如:
def divide(a, b):
try:
result = a / b
except ZeroDivisionError:
print("division by zero!")
except TypeError:
print("operand type(s) not supported for division")
else:
print(f"result is {result}")
finally:
print("executing finally clause")
divide(2, 1)
# Output: result is 2.0
# executing finally clause
divide(2, 0)
# Output: division by zero!
# executing finally clause
divide("2", "1")
# Output: operand type(s) not supported for division
# executing finally clause
在这个例子中,我们添加了一个额外的 except
语句,用于处理 TypeError
异常。这样,当我们尝试将字符串相除时,程序就会跳转到这个 except
语句中,并打印一条错误消息。
如果你想要在 except
语句中获取有关异常的更多信息,可以使用如下语法:
except ExceptionType as exception:
# code to handle the exception
其中 ExceptionType
是异常的类型,exception
是一个异常对象,它包含有关异常的详细信息。你可以使用这个对象的属性和方法来获取有关异常的信息。
例如,你可以使用 exception.args
属性来获取异常的参数列表,或者使用 exception.__str__()
方法来获取异常的字符串表示。
举个例子:
def divide(a, b):
try:
result = a / b
except ZeroDivisionError as e:
print("division by zero! Exception args:", e.args)
except TypeError as e:
print("operand type(s) not supported for division. Exception args:", e.args)
另外,你还可以使用 raise
关键字来显式地引发异常。这样做可以用来报告特定的错误或终止程序执行。
例如,你可以使用如下语法来引发 ValueError
异常:
raise ValueError("invalid value")
你也可以使用 raise
语句来重新引发已经被捕获的异常。这可以用来继续传递异常,以便在更高层次处理。
例如,你可以使用如下语法来重新引发已经被捕获的异常:
try:
# code that might raise an exception
except Exception as e:
# code to handle the exception
raise
在这个例子中,如果发生了异常,那么程序会跳转到 except
块中并执行处理程序。然后,程序会使用 raise
语句重新引发异常,使它能够在更高层次被处理。
注意,在使用 raise
语句重新引发异常时,你应该省略异常的类型和参数。这是因为这些信息已经在捕获异常时存储在变量中,因此可以直接使用。
例如,你可以使用如下语法来重新引发已经被捕获的异常:
try:
# code that might raise an exception
except Exception as e:
# code to handle the exception
raise
在 Python 中,还有一种用于处理异常的方法——使用上下文管理器和 with
语句。
上下文管理器是一种特殊的对象,它实现了 __enter__
和 __exit__
方法。当使用 with
语句时,会自动调用上下文管理器的 __enter__
方法,并在 with
块执行完毕后调用 __exit__
方法。
举个例子,你可以使用如下语法来打开文件并读取其内容:
with open("file.txt") as f:
for line in f:
print(line)
在这个例子中,open
函数返回一个文件对象,该对象实现了上下文管理器协议。因此,你可以使用 with
语句来自动打开和关闭文件。
你还可以使用 with
语句来处理异常。例如,你可以使用如下语法来处理文件打开失败的情况:
try:
with open("file.txt") as f:
for line in f:
print(line)
except FileNotFoundError:
print("file not found")
在这个例子中,如果打开文件失败,那么会引发 FileNotFoundError
异常。程序会跳转到 except
块中并打印一条消息。
注意,使用 with
语句处理异常的方法通常比使用 try
和 except
语句更简单,因为它可以自动执行资源管理和异常处理。