【问题标题】:python django exception handlingpython django异常处理
【发布时间】:2015-02-16 06:15:15
【问题描述】:

我有一个使用异常的查询:

try:
    sm = Something.objects.get(id=5)
except Something.DoesNotExist:
    pass

在这里 pass 是做什么的?我的意思是,如果我的整个视图依赖于 sm 并且它没有得到 sm 怎么办。我应该手动设置“sm”吗:

except Something.DoesNotExist:
    sm = anything

我只想知道如果 pass 没有找到所查询的内容会做什么。如果它只是忽略 except 之后的部分并走得更远,那有什么意义,因为我的整个观点取决于sm

谢谢

【问题讨论】:

    标签: python django exception-handling


    【解决方案1】:

    上述上下文中的关键字pass 忽略了DoesNotExist 异常。如果您的程序依赖于代码中某处是否存在sm,则应将其设置为None,并在需要的位置检查其值。

    try:
        sm = Something.objects.get(id=5)
    except Something.DoesNotExist:
        sm = None
    
    if sm:
        ...
    

    或者,您可以在 try/catch 块的 else 部分完成您的工作。只有在try 块中的代码没有引发异常时才会执行。

    try:
        sm = Something.objects.get(id=5)
    except Something.DoesNotExist:
        # do something here..
    else:
        print sm
        ...
    

    【讨论】:

    • 另外,如果您只是想通过 404 异常(如果未找到此东西),请改用:something = get_object_or_404(Something, id=5)
    • 如果在except中找不到对象,我可以设置默认值吗?比如除了Something.DoesNotExist: sm = "someone"
    • AFAIK,Django 没有为这种情况提供快捷方式,但当然你可以在 Python 中完成。但是,如果您已经有默认值,我建议您将其设置在 try/catch 之上的某个位置,以提高代码的可读性。你可以写一些方法,比如get_object_or_default(Something, id=5, default="someone")
    • 哦,那我想使用 sm.phone_no 之类的 sm 属性怎么样
    • 除非创建了实例,否则您不能使用实例(在本例中为 sm)属性。您应该将电话号码的默认值设置为class property,可能类似于Something.DEFAULT_PHONE_NO,这样即使没有创建sm,您也可以使用它。
    【解决方案2】:

    pass is a null statement that does nothing,当您因缩进规则需要语句但又不想编写代码时很有用。

    如果您将其删除以获得代码:

    try:
        sm = Something.objects.get(id=5)
    except Something.DoesNotExist:
    

    它会因语法错误而失败。


    至于如果你没有找到你要找的项目怎么办,这在很大程度上取决于代码的其余部分。但是,在这种情况下,最好向 someone 显示错误,因为这就是发生的情况 - 您请求的项目不存在。

    【讨论】:

      【解决方案3】:

      passno-op 并且什么都不做。它需要在 except 块中以符合 python 语法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        • 2022-10-14
        • 1970-01-01
        相关资源
        最近更新 更多