我如何将此代码编写为 'try-except' 块而不是几个 if 块?
How would I write this code as a 'try-except' block instead of several if-blocks?
我已经编写了一个 django FormView 来处理表单集,并且最近向我介绍了 'try except' 语法。我觉得如果我使用 'try except' 块,我的代码会更干燥,但我有编写器块。您如何将此块重新格式化为 'try except'?
def post(self, request, *args, **kwargs):
formset_post = self.formset(request.POST)
if 'url_fk_id' not in kwargs:
kwargs['url_fk_id'] = self.kwargs.get(self.url_fk_id)
form_fk_id = get_object_or_404(models.Fk, id=kwargs['url_fk_id'])
for form in formset_post:
form.instance.fk_id = form_fk_id
list_of_primary_entries = []
if form.instance.entry_is_primary is True:
if True not in Entry.objects.filter(fk_id=form_fk_id).values()
pass
else:
raise forms.ValidationError("there can only be one primary entry")
list_of_primary_entries.append('4')
if len(list_of_primary_entries) > 1:
raise forms.ValidationError("there can only be one primary entry")
if formset_post.is_valid():
for form in formset_post:
form.save()
else:
return self.form_invalid(formset_post)
print(self.request.POST)
return super().post(self, request, *args, **kwargs)
我认为您的代码不会从 try/except 块中获得任何东西。 Try/except 块是一个很好的 shorthand 用于跳过一些检查并只是看看会发生什么。例如:
inum = input('Enter a number:')
if inum.isdigit(): # check if inputted string looks valid BEFORE trying to convert
num = int(inum)
else:
num = -1
print('Oops!')
相比于:
inum = input('Enter a number')
try: # just try to convert it and see what happens!
num = int(inum)
except:
num = -1
print('Oops!)
此外,try/except 块旨在捕获抛出的异常,以允许您的代码保持 运行 即使发生错误,也更加健壮。您可能希望在 try/except 块内抛出可能失败的可疑调用。例如,您可能需要:
form_fk_id = get_object_or_404(models.Fk, id=kwargs['url_fk_id'])
成为:
try:
form_fk_id = get_object_or_404(models.Fk, id=kwargs['url_fk_id'])
except:
form_fk_id = None
print('Object not available right now')
然后处理调用 get_object_or_404() 失败的情况。如果您正在拨打 Internet 电话或访问一些当前不可用的外部资源,这会很有帮助。最好让您的代码捕获并处理它而不是失败。例如,如果您尝试访问外部资源,如果调用失败,您可能希望在一定时间后重试等...
以上只是我的两分钱。意见各不相同......但我确实发现良好的错误检查总是好的。它使您的代码更健壮,更易读。
我已经编写了一个 django FormView 来处理表单集,并且最近向我介绍了 'try except' 语法。我觉得如果我使用 'try except' 块,我的代码会更干燥,但我有编写器块。您如何将此块重新格式化为 'try except'?
def post(self, request, *args, **kwargs):
formset_post = self.formset(request.POST)
if 'url_fk_id' not in kwargs:
kwargs['url_fk_id'] = self.kwargs.get(self.url_fk_id)
form_fk_id = get_object_or_404(models.Fk, id=kwargs['url_fk_id'])
for form in formset_post:
form.instance.fk_id = form_fk_id
list_of_primary_entries = []
if form.instance.entry_is_primary is True:
if True not in Entry.objects.filter(fk_id=form_fk_id).values()
pass
else:
raise forms.ValidationError("there can only be one primary entry")
list_of_primary_entries.append('4')
if len(list_of_primary_entries) > 1:
raise forms.ValidationError("there can only be one primary entry")
if formset_post.is_valid():
for form in formset_post:
form.save()
else:
return self.form_invalid(formset_post)
print(self.request.POST)
return super().post(self, request, *args, **kwargs)
我认为您的代码不会从 try/except 块中获得任何东西。 Try/except 块是一个很好的 shorthand 用于跳过一些检查并只是看看会发生什么。例如:
inum = input('Enter a number:')
if inum.isdigit(): # check if inputted string looks valid BEFORE trying to convert
num = int(inum)
else:
num = -1
print('Oops!')
相比于:
inum = input('Enter a number')
try: # just try to convert it and see what happens!
num = int(inum)
except:
num = -1
print('Oops!)
此外,try/except 块旨在捕获抛出的异常,以允许您的代码保持 运行 即使发生错误,也更加健壮。您可能希望在 try/except 块内抛出可能失败的可疑调用。例如,您可能需要:
form_fk_id = get_object_or_404(models.Fk, id=kwargs['url_fk_id'])
成为:
try:
form_fk_id = get_object_or_404(models.Fk, id=kwargs['url_fk_id'])
except:
form_fk_id = None
print('Object not available right now')
然后处理调用 get_object_or_404() 失败的情况。如果您正在拨打 Internet 电话或访问一些当前不可用的外部资源,这会很有帮助。最好让您的代码捕获并处理它而不是失败。例如,如果您尝试访问外部资源,如果调用失败,您可能希望在一定时间后重试等...
以上只是我的两分钱。意见各不相同......但我确实发现良好的错误检查总是好的。它使您的代码更健壮,更易读。