【发布时间】:2017-12-23 18:06:28
【问题描述】:
我正在构建一个 Django 应用程序,并希望获得一些关于处理我的代码中的错误和错误的正确方法的建议。
以下是我遇到的问题的典型示例:用户购买了产品。要处理购买,我的视图需要执行一些操作:
- 首先,视图应该在数据库中创建一个
User对象。 - 如果成功,视图应该创建一个
Order对象并将其分配给新创建的用户。 - 如果成功,我的代码应该创建一个
Product对象并将其添加到新创建的订单中。
当没有错误发生时,这一切都很好——但我发现偶尔的错误在我的代码中是不可避免的,我希望我的应用程序能够优雅地处理错误,而不是彻底崩溃。例如,如果由于某种原因无法创建 Order 对象,则视图应向用户显示错误并删除之前创建的 User 对象。而且,它应该抛出一个优雅的错误消息,而不是直接崩溃并为用户提供 Http 500 错误。
我能想到的唯一方法是一系列极其复杂的嵌套 try / except 子句,如下所示。但是以这种方式设计我的代码非常混乱和耗时,而且感觉不是正确的做事方式。我知道必须有更好的方法来设计 Django 和 Python 中的正确错误处理,但我不太确定它是什么。
对于如何在这种情况下更好地构建我的代码的任何建议,我将不胜感激。
示例代码:
try:
# Create a new user
u = User(email='test@test.com')
u.save()
try:
# Create a new order
o = Order(user=u, name='Order name')
o.save()
try:
# Create a new product
p = Product(order=o, name='Product name')
p.save()
# If a product cannot be created, print an error message and try deleting the user and order that were previously created
except:
messages.add_message(request, messages.ERROR, 'Product could not be created')
# If deleting the order doesn't work for any reason (for example, o.save() didn't properly save the user), 'pass' to ensure my application doesn't crash
try:
o.delete()
# I use these 'except: pass' clauses to ensure that if an error occurs, my app doesn't serve a Http 500 error and instead shows the user a graceful error
except:
pass
# If deleting the user doesn't work for any reason (for example, u.save() didn't properly save the user), 'pass' to ensure my application doesn't crash
try:
u.delete()
except:
pass
# If an order cannot be created, print an error message and try deleting the user that was previously created
except:
messages.add_message(request, messages.ERROR, 'Order could not be created')
# If deleting the user doesn't work for any reason (for example, u.save() didn't properly save the user), 'pass' to ensure my application doesn't crash
try:
u.delete()
except:
pass
# If the user cannot be created, throw an error
except:
messages.add_message(request, messages.ERROR, 'User could not be created')
【问题讨论】:
标签: python django exception error-handling exception-handling