python异常处理详解
核心概念:python异常处理是处理程序运行时错误的关键机制。主要通过try/except语句实现。其核心思想是请求原谅比请求许可更简单。这和许多其他语言的防御性编程形成对比。
python异常处理包含四个主要部分:
try:
result = 10/value
file = open(data.txt)
data = file.read()
expcept ZeroDivisionError
print("除数不能为零")
except(FileNotFoundError,PermissionError) as e:
print(f"文件错误:{e}")
except Exception as e:
print{f"未知错误:{e}"}
logging.exception{"详细错误日志"}
else:
print("操作成功完成")
finally:
print("清理资源")
file.close() if 'file' in locals() else None
1.try块
,包含可能引发异常的代码,应仅包含可能出错的代码,避免放入过多无关逻辑。
2.except块,
捕获特定类型异常,捕获顺序很重要:从具体到通用常见异常类型:ValueError:值无效。 TypeError类型错误,IndexError,索引超出范围。KeyError字典键不存在。FileNotFoundError:文件不存在。Exception:所有内置异常的基类。
3.else块
常被忽略
仅仅在try块无异常的时候执行,用于将正常流程和异常处理分离。为什么不放在try块的末尾呢,是为了避免意外捕获else中异常。
4.finally块
无论是否发生异常都会执行,用于释放资源(文件关闭,数据库连接释放等)即使在try/except中有return语句也会执行。
高级技巧与最佳实践**
1.自定义异常
class PaymentError(Exception):
"""支付相关异常的基类"""
class InsufficientFundsError(PaymentError)
def __init__(self,balance,amount):
super().__init__(f"余额不足:{balance} < {amount}")
self.balance = balance
self.amount = amount
这段代码定义了一个自定义异常类insufficientfundserror,用于在“支付金额超过账余额”的场景下抛出错误(比如银行转账,购物付款时余额不足)。拆解一下他的作用和语法:
1.首先理解什么是自定义异常,python内置了很多常见异常,但是实际开发中,我们常常需要根据业务场景定义特定含义的异常,让错误信息更直观,这就是自定义异常。这个类继承自PaymentError,继承的目的是让InsufficientFundsError拥有PaymentError的所有特性,同时田间自己的专属逻辑(这里是余额不足的具体信息)。def init(self,balance,amount):这是这个类的构造函数,用于初始化异常对象。参数balance表示“当前账户余额”,amount表示要支付的金额。super().init(f"余额不足:{balance} < {amount}")
super().init()表示调用父类PaymentError的构造函数,并传入一个错误提示字符串,比如balance = 100,amount=200时,字符串是余额不足: 100<200。父类构造函数会处理这个错误信息,这两行将balance和amount保存为当前异常对象的属性,方便后续捕获异常时,能直接获取这两个具体数值(而不只是一个字符串提示)。
#使用
try:
process_payment()
except InsufficientFundsError as e:
print(f"支付失败:{e}")
print(f"当前余额:{e.balance},需支付:{e.amount}")
当process_payment()函数检测到“余额不足”时,会主动抛出InsufficientFundsError异常,此时必须传入balance和amount的具体值。例如process_payment(内部可能是这样实现的:
def process_payment():
current_balance = 100
payment_amount = 200
if payment_amount > current_balance:
#关键:抛出异常时传入具体的余额和金额
raise InsufficientFundsError(current_balance,payment_amount)
这里的currnet_balance = 100 和 payment_amount = 200,就是后续e.balance和e.amount的源头。当InsufficientFundsError被创建时(即raise语句执行时),会调用它的__init__构造函数,将传入的banlance和amount保存为对象的属性。
self.balance = balance # 比如保存100
self.amount = amount # 比如保存200
这两个属性是否需要提前定义呢,在python中,不需要提前定义这两个属性,self.balance和self.amount,这是python动态语言的特性决定的,在类的方法中,包括__init__构造函数,可以直接通过self.属性名 = 值的方式动态添加属性,无需像静态语言如c++,java那样在类中提前声明成员变量。如果是java这类静态语言,必须在类中提前声明成员变量才能使用。
2.捕获所有异常,不确定异常类型的时候,可以捕获所有异常:
try:
risky_operation()
except Exception as e:
print("发生错误",e)
这样可以捕获所有的异常
葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。
更多推荐



所有评论(0)