在获取模型对象时如何使用 try 和 except?

Posted

技术标签:

【中文标题】在获取模型对象时如何使用 try 和 except?【英文标题】:how can i use try and except while getting model objects? 【发布时间】:2021-08-09 23:44:38 【问题描述】:

我必须在下面的代码中使用 try 和 except 块,因为我正在尝试获取模型类对象,但如果数据库为空,那么我需要使用 try 和 except。

if(txStatus=='SUCCESS'):
    order=Order.objects.get(id=id)    #NEED TRY ACCEPT BLOCK FOR THIS
    URL = payment_collection_webhook_url 
    request_data =          
    json_data = json.dumps(request_data)
    requests.post(url = URL, data = json_data)
    return Response(status=status.HTTP_200_OK)

【问题讨论】:

如果数据库中缺少该项目应该怎么办? 有一些方便的函数来处理丢失的对象。它们以get_or_... 开头。 这能回答你的问题吗? How do I get the object if it exists, or None if it does not exist? 【参考方案1】:

try..except..else..finally 块的工作方式如下:

try:
    order=Order.objects.get(id=id)
except ObjectDoesNotExist(or MultipleObjectsReturned in case it returns more 
than 1 queryset or instance):
    ...Handle the exception, Write any code you want
else:
    ...This gets called if there is no exception or error, means it will 
    execute right after try statement if there's no error, so if you want 
    something more to happen only if the code doesn't throw an error, you can 
    write it here
finally:
    ...This gets executed no matter what in any case, means if there's 
    something you want to execute regardless of whether it throws an 
    exception or not, you write it here.

【讨论】:

非常感谢@HardeepChhabra,你解释得很好。您能否在您编写“处理异常,编写任何您想要的代码”的部分中举例说明,此代码块仅在对象不存在时才会执行吗? 你好@AmitYadav 是的,当异常发生时它会起作用我想给你一个建议,如果你不知道会发生哪个异常,你可以使用except Exception as e:,你也可以使用@ 987654323@如果记录不存在则返回404 非常感谢@AnkitTiwari 的建议。 好的,非常感谢@HardeepChhabra 的帮助 @AmitYadav 很抱歉这么晚才回复你。是的,EXCEPT 块只会在 Django 抛出错误时执行。例如,在您的情况下,只要对象不存在,它就会进入 EXCEPT 块,为什么?因为每次模型中没有对象时 Django 都会抛出错误。所以,长话短说,无论如何,它首先进入 try。如果 Django 抛出一个错误,它会立即跳转到 except,然后你可以随心所欲地处理错误,然后它会进入 finally。如果没有错误,则tryelsefinally。简单的。如果这有帮助,请点赞【参考方案2】:

就这么简单:

try:
    order = Order.objects.get(id=order_id)
except Order.DoesNotExist:
    # Exception thrown when the .get() function does not find any item.
    pass  # Handle the exception here. 

您可以找到有关DoesNotExist 异常here 的更多信息。

【讨论】:

感谢@Hagyn 的帮助。【参考方案3】:

@Hagyn 是正确的,但在 Django 中还有另一种方法:

类似这样的:

orders = Order.objects.filter(id=order_id)
if orders.exists():
    order = orders.last()
else:
    # do rest of the things

【讨论】:

感谢@Ashraful 的帮助。

以上是关于在获取模型对象时如何使用 try 和 except?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 提示符处引发错误后如何获取最后一个异常对象?

delphi异常捕获try except语句 和 try finally语句用法

Python Try Except

Python Try Except

获取对象时如何处理“匹配查询不存在”

Python中获取异常(try Exception)信息