Python 提供了多种处理报错异常的方法,使程序能够在遇到错误时优雅地处理,避免程序崩溃,并给出有意义的反馈。以下是 Python 处理异常的主要方法以及它们的详细解释和示例:
1. try-except
语句
最基础的异常处理方式是使用 try-except
语句,捕获并处理可能发生的异常。
基本用法:
try: result = 10 / 0 except ZeroDivisionError: print("Cannot divide by zero")
try
块:包含可能引发异常的代码。except
块:捕获并处理特定类型的异常。
示例:
try: num = int(input("Enter a number: ")) result = 10 / num print(f"Result is {result}") except ZeroDivisionError: print("Error: Cannot divide by zero.") except ValueError: print("Error: Invalid input. Please enter a valid number.")
2. 捕获多种异常
可以在 except
块中捕获多种异常类型,如果有多种可能的错误,可以使用多个 except
块,或者将异常类型放在一个元组中。
try: # 可能引发多种异常的代码 num = int(input("Enter a number: ")) result = 10 / num print(f"Result is {result}") except (ZeroDivisionError, ValueError) as e: print(f"An error occurred: {e}")
3. try-except-else
结构
else
块在 try
块中代码没有抛出异常时执行。如果希望在没有异常的情况下执行某些操作,可以使用 else
。
try: num = int(input("Enter a number: ")) result = 10 / num except ZeroDivisionError: print("Error: Cannot divide by zero.") except ValueError: print("Error: Invalid input. Please enter a valid number.") else: print(f"Result is {result}")
4. try-except-finally
结构
finally
块中的代码无论是否抛出异常都会执行,通常用于资源清理,如关闭文件、释放锁等。
try: file = open("example.txt", "r") content = file.read() except FileNotFoundError: print("Error: File not found.") finally: file.close() # 确保文件总是被关闭
5. 捕获所有异常
可以通过不指定异常类型,使用一个通用的 except
块来捕获所有异常。但这样做可能会掩盖真正的错误来源,因此在实际开发中应谨慎使用。
try: # 可能引发任何异常的代码 result = 10 / int(input("Enter a number: ")) except Exception as e: print(f"An error occurred: {e}")
6. 自定义异常
在某些情况下,可能需要定义自己的异常类型。可以通过继承内置的 Exception
类来自定义异常类型,然后在程序中抛出和处理这些自定义异常。
定义自定义异常:
class NegativeNumberError(Exception): pass
使用自定义异常:
def check_positive(num): if num < 0: raise NegativeNumberError("Negative numbers are not allowed.") return num try: num = int(input("Enter a positive number: ")) check_positive(num) except NegativeNumberError as e: print(e)
7. assert
语句
assert
语句用于调试时检查条件,如果条件为 False
,则抛出 AssertionError
异常。
def divide(a, b): assert b != 0, "Cannot divide by zero" return a / b try: print(divide(10, 0)) except AssertionError as e: print(e)
8. 使用 raise
重新抛出异常
在某些情况下,捕获异常后需要重新抛出异常,可以使用 raise
关键字。
try: num = int(input("Enter a number: ")) if num == 0: raise ZeroDivisionError("Zero is not allowed.") result = 10 / num except ZeroDivisionError as e: print(f"Handling error: {e}") raise # 重新抛出异常
9. 上下文管理器和 with
语句
上下文管理器通常用于管理资源,结合 with
语句可以自动处理资源的分配和释放,同时支持异常处理。
try: with open("example.txt", "r") as file: content = file.read() print(content) except FileNotFoundError as e: print(f"File error: {e}")
10. 日志记录异常
使用 logging
模块可以记录异常信息,而不是简单地打印出来,这对于调试和维护大型项目特别有用。
import logging logging.basicConfig(filename='error.log', level=logging.ERROR) try: num = int(input("Enter a number: ")) result = 10 / num except ZeroDivisionError: logging.error("Attempted to divide by zero.") except ValueError: logging.error("Invalid input. Expected a number.")
通过这些方法,Python 提供了灵活且强大的异常处理机制,使开发者能够有效地应对程序中的各种错误,确保程序的健壮性和稳定性。