我道歉,无法提出更好的问题标题,请听我说。
我写了一个视图,我在创建实例后发送电子邮件,它按预期工作(ba dum tss)
def my_view(request):
# some code
# notify_by_email code
# some more code
现在我正在考虑将notify_by_email
提取到单独的方法notify_by_email(new_instance)
。我正在考虑这样做有几个原因:a)notify_by_email
部分代码使view
混乱并降低了可读性b)我感觉我可能在另一个视图中使用该方法,会违反DRY。
无论如何,现在我在这里
def my_view(request):
# some code
notify_by_email(new_instance)
# some more code
现在我正在考虑错误处理,如果无法发送电子邮件(或其他任何方法,我不想让整个视图掉落) - 我对这个概念感到好奇。现在我们需要try-block
,对吗?
我应该在视图中try-block
:
def my_view(request):
# some code
try:
notify_by_email(new_instance)
except SomeException:
pass
# some more code
或者无论如何调用方法,并在方法本身内进行错误处理?
我不知道这个问题是Python
ic还是Django
是...我的逻辑中是否存在缺陷?这些方法之间是否存在概念上的差异(正确/错误的方式)?请解释一下。
谢谢。
答案 0 :(得分:2)
常见的说法是提前抛出异常并及时捕获异常。这句话的前一部分很简单,但后一部分不是。
如果您尽可能晚地抛出异常,那么所有异常处理都将在最顶层进行。那会很难看。相反,我提出了更多的内容:
notify_by_email
,其中一个您不关心处理异常,因此您只需直接在方法中处理它并跳过异常;然后在其他地方您想要异常,但是您由于您在方法中的异常处理,无法使用它。)如果您有一个方法send_email(address, contents)
,并且其范围内的所有内容都是发送电子邮件所需的属性,那么处理该异常除非您只想继续前进,否则不会非常有用问题。如果你想在你的程序界面上显示一条消息,你需要访问显示这样的功能,这是你没有的。
现在,我不熟悉Django,所以我不知道view
在这种情况下是什么,但听起来它与显示事物有关。如果是这种情况,那么my_view
将足够高以正确处理异常。现在,如果您的notify_by_email
方法显示一条消息说它已成功,那么这将是处理异常并显示错误的合适位置,因为这意味着它具有必要的范围。
如果异常不是一个大问题,并且您只想继续,那么您决定编写一个日志文件,那么您就在现场处理它。这是否意味着正确地编写文件,或者将消息附加到带有其他可能消息的变量并稍后写入。
对于更深入的输入和讨论,还有这篇文章here