Python 概念。从视图调用方法。错误处理

Python 概念。从视图调用方法。错误处理,python,django,Python,Django,很抱歉,我想不出更好的题目,请听我说完 我写了一个视图,在创建一个实例后,我在其中发送了一封电子邮件,并且它按预期工作(ba dum tss) 现在我考虑将notifybyemail提取到单独的方法notifybyemail(新实例)。我考虑这样做有几个原因:a)notify\u by\u email部分的代码扰乱了视图,降低了可读性;b)我感觉我可能在另一个视图中使用了该方法,这将违反DRY 不管怎样,现在我在这里 def my_view(request): # some code notif

很抱歉,我想不出更好的题目,请听我说完

我写了一个视图,在创建一个实例后,我在其中发送了一封电子邮件,并且它按预期工作(ba dum tss)

现在我考虑将
notifybyemail
提取到单独的方法
notifybyemail(新实例)
。我考虑这样做有几个原因:a)
notify\u by\u email
部分的代码扰乱了
视图,降低了可读性;b)我感觉我可能在另一个视图中使用了该方法,这将违反DRY

不管怎样,现在我在这里

def my_view(request):
# some code
notify_by_email(new_instance)
# some more code
现在我正在考虑错误处理,如果电子邮件无法发送,我不希望整个视图都崩溃(或者不管其他方法做什么——我对这个概念很好奇)。现在我们需要
try块
,对吗

我是否应该在视图中使用
try block

def my_view(request):
# some code
try:
  notify_by_email(new_instance)
except SomeException:
  pass
# some more code
或者调用该方法,并在该方法本身内进行错误处理

我不知道这个问题更像是
Python
ic还是
Django
ish。。。我的逻辑有缺陷吗?两种方法之间是否存在概念上的差异(正确/错误的方式)?请解释一下


谢谢。

一个常见的说法是尽早抛出异常,晚捕获异常。这句话的前半部分很直截了当,但后半部分则不然

如果尽可能晚地抛出异常,那么所有异常处理都将在最高层完成。那会很难看的。相反,我提出了一些更大致的建议:

  • 如果处理得足够晚,则由于异常处理,方法的使用不会变得专门化。(例如,您在两个位置使用
    notify by_email
    ,其中一个位置您不关心异常的处理,因此您只需在方法中直接处理异常并跳过异常;然后在其他位置您需要异常,但由于您在方法中的异常处理,您无法使用。)
  • 足够晚地处理它,以便有足够大的范围来充分处理异常。如果您需要向GUI程序的用户发出电子邮件失败的警报,并且您的函数无法访问绘制警报所需的函数,则需要扩大范围
  • 不要等得太久。一旦你有足够高的处理能力,以至于你没有专门化你的功能,并且你有足够的范围,那就是一个很好的地方
  • 代码结构很像艺术。这是主观的,有时当你觉得这是一种进步时,你就违反了规则
如果您有一个方法
send\u email(地址、内容)
,并且它的作用域中只有发送电子邮件所需的属性,那么处理异常将不会非常有用,除非您只想继续,忽略问题。如果希望在程序界面上显示消息,则需要访问显示该消息所需的功能,而您没有这些功能

现在,我对Django不太熟悉,所以我不知道在这个上下文中,
视图是什么,但听起来它似乎与显示内容有关。如果是这样的话,
my_view
将足够高,可以正确处理异常。现在,如果您的
notify\u by\u email
方法显示一条消息说它成功了,那么这将是处理异常和显示错误的适当位置,因为这意味着它具有必要的范围

如果异常不是一个大问题,并且您只想继续,因此您决定编写一个日志文件,然后立即处理它。这是否意味着立即写入文件,或者将消息与其他可能的消息一起附加到变量,然后再写入


要获得更深入的意见和讨论,请参阅本帖

,非常感谢您的详细回复。
def my_view(request):
# some code
try:
  notify_by_email(new_instance)
except SomeException:
  pass
# some more code