核心概念: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)

这样可以捕获所有的异常

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。

更多推荐