Python的异常处理机制通过检测与响应错误显著提升了程序的稳定性。开发者利用try和except语句结构捕捉并管理异常,使得程序即使遭遇问题也能优雅处理而非直接崩溃,极大增强了Python程序的可靠性和实用性。
基本异常处理结构
异常处理主要通过try
和except
实现:先执行try
块代码,若未发生异常,则直接忽略except
部分;若try
块出现异常,Python运行时会尝试找到对应的except
块,并检查是否匹配该异常类型进行处理。
import logging
try:
# 尝试执行的代码
pass
except ValueError as e:
# 如果发生 ValueError 异常,则执行这里的代码
logging.error("Caught ValueError: %s", str(e))
except IOError as e:
# 如果发生 IOError 异常,则执行这里的代码
logging.error("Caught IOError: %s", str(e))
else:
# 如果没有异常发生,则执行这里的代码
logging.info("No exceptions occurred.")
finally:
# 不管是否发生异常,都会执行这里的代码
logging.info("Execution completed.")
捕获特定异常
此方法允许根据需求捕获特定类型的异常,大大增强了程序的针对性与安全性。虽然未指定类型的except
子句具有普遍适用性,能够捕获所有异常,但其可能掩盖潜在问题,因此并不总是推荐使用。
import logging
try:
x = 1 / 0
except ZeroDivisionError as e:
logging.error("Caught ZeroDivisionError: %s", str(e))
print("不能除以0")
捕获所有异常
当不确定异常类型时,可以通过使用空的 except 子句来捕获所有类型的异常。但是,这种做法应尽量避免,因为它可能会忽视一些实际上需要关注和处理的严重错误。
import logging
try:
# 尝试执行的代码
pass
except Exception as e:
logging.error("Caught an exception: %s", str(e))
print("发生了一个异常: ", str(e))
自定义异常
Python 支持用户通过继承内置 Exception
类或其子类来创建自定义异常,这一特性极大提升了开发者处理错误的灵活性。它使开发者能够精准地捕捉和管理各种异常情形,进而显著增强程序的稳定性和可维护性。
import logging
def safe_division(numerator, denominator):
try:
result = numerator / denominator
except ZeroDivisionError as e:
logging.error("Caught ZeroDivisionError while dividing %d by %d: %s",
numerator, denominator, str(e))
print("发生了一个异常: 除以零")
return None
except Exception as e:
logging.error("Caught an exception while dividing %d by %d: %s",
numerator, denominator, str(e))
print("发生了一个异常: ", str(e))
return None
else:
logging.info("Division successful: %d / %d = %f",
numerator, denominator, result)
return result
使用示例
numerator = 1
denominator = 0
result = safe_division(numerator, denominator)
if result is not None:
print(f"结果是 {result}")