【问题标题】:How would I write this code as a 'try-except' block instead of several if-blocks?我如何将此代码编写为“try-except”块而不是几个 if-block?
【发布时间】:2020-03-15 10:22:31
【问题描述】:

我已经编写了一个 django FormView 来处理一个表单集,并且我最近被介绍了 'try except' 语法。我有一种感觉,如果我使用“try except”块,我的代码将是 DRYer,但我有 writers 块。您将如何将此块重新格式化为“尝试除外”?

    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)

【问题讨论】:

    标签: python django-forms django-views try-except formset


    【解决方案1】:

    我认为您的代码不会从 try/except 块中获得任何好处。 Try/except 块是跳过一些检查并查看发生了什么的好方法。例如:

    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 电话或访问一些当前不可用的外部资源,这会很有帮助。最好让您的代码捕获并处理它而不是失败。例如,如果您尝试访问外部资源,如果调用失败,您可能需要在一定时间后重试,等等...

    以上只是我的两分钱。意见各不相同......但我确实发现好的错误检查总是好的。它使您的代码更健壮且更具可读性。

    【讨论】:

    • isdigit 无论如何都是错误的检查。这是一个 Unicode 字符属性测试,而不是一个字符串是否可以被解析为数字的测试。我认为我从未见过正确使用 isdigit 的代码。
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 2011-06-26
    • 2018-07-14
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多