Django视图报错Local variable 'cid' referenced before assignment求助
报错根因
你遇到的Local variable 'cid' referenced before assignment错误原因如下:
cid、name两个变量仅在try代码块执行无异常时才会被赋值,一旦try块内创建Transaction对象的逻辑抛出异常、进入except分支,这两个变量未做任何初始化声明,后续组装context时直接引用就会触发未赋值报错- 额外隐藏问题:
- 你给
name、cid赋值的语句末尾多了逗号,会导致两个变量被赋值为元组而非你预期的字符串 - 当前使用裸
except会捕获所有异常包括系统级异常,后续排查问题难度极高,建议指定捕获的异常类型 - 异常分支未做单独的返回处理,就算支付出错也会渲染支付成功页,不符合业务逻辑
- 你给
修复后代码
from django.core.exceptions import ValidationError class CheckoutSuccessView(View): model = Transaction template_name = 'success.html' def get(self, request, *args, **kwargs): # return render(request, self.template_name,{'transaction':transaction}) return HttpResponse('nothing to see') def post(self, request, *args, **kwargs): data = self.request.POST # 提前初始化变量,避免未赋值问题 cid = "" name = "" try: Transaction.objects.create( name = data['value_a'], cid = data['value_b'], tran_id=data['tran_id'], val_id=data['val_id'], amount=data['amount'], card_type=data['card_type'], card_no=data['card_no'], # 其余字段按你的业务逻辑补全 ) messages.success(request,'支付成功') # 去掉末尾多余的逗号,避免变量变成元组 name = data['value_a'] cid = data['value_b'] # 按实际业务需求指定捕获的异常类型,此处以常见的字段缺失、数据校验错误为例 except (KeyError, ValidationError): messages.error(request,'支付出现异常,请重试') # 异常分支可以跳转到错误页,也可以按业务需求自定义返回逻辑 return render(request, 'error.html') context = { 'cid': cid, 'name' : name } return render(request, self.template_name, context)
内容的提问来源于stack exchange,提问作者Md Hasan
相关产品推荐
相关产品推荐

