(SO的长期读者,第一次问一个q。

我对C#相当陌生,因为他已经在PHP / Ruby / Python领域工作了很多年,因此如果这是一个愚蠢的问题,我深表歉意。)

我正在对SmtpClient.Send()失败时崩溃的旧C#应用程序进行一些维护。从我从MSDN收集到的一点信息中,我可以看到解决此问题的明显方法,但是我的问题也与更一般的情况有关。

根据MSDN:

  try {
          client.Send(message);
  }
  catch (Exception ex) {
          Console.WriteLine("Exception caught in CreateTestMessage2(): {0}",
                ex.ToString() );
  }


这一切对我来说都是有意义的,但我也一直认为,只要您能防止发生错误的可能性,就可以这样做。您有什么办法(应该做?)来减少Send()抛出异常的可能性?

我假设在某些情况下无法避免发生异常的可能性,因此您必须处理该异常,但是人们是否有任何通用的样式指南或规则来指导它们?

同样,如果这是一个废话,很抱歉。我尝试了尽可能搜索SO和Google。

编辑:我刚刚发现此问题Best practices for exception management in java or C
 这很可能会回答我的问题。

EDIT2:非常感谢您的迅速反馈。我一直在考虑这个问题,也许这可以进一步完善我的要求。

说确实无法避免某些异常(例如SmtpException)是否正确?说使用SmtpException之类的异常来告诉您发送中出了点问题,而您只是想按自己的意愿处理,这是否是正确的样式呢?

我觉得我在这个问题上听起来有些模糊,但我在问,因为我能学到的任何东西都对我的自信很有帮助。

最佳答案

捕获异常时,如果您知道期望从调用的方法中获取哪种异常,则应尽可能具体。例如,这将允许诸如OutOfMemoryException之类的错误继续在堆栈中冒泡,使堆栈无法处理,然后您的应用程序将快速失败(这可能是一件好事,因为您的系统现在处于未知状态,您不应继续)。

但是,对此有不同的思想流派。在某些情况下(例如,您是NT服务),您希望应用程序具有高可用性,并且由于某些不可预见的代码路径上出现NullPointerException而导致生产崩溃,只要记录了该异常并且您有能力然后发布QFE(更不用说修改您的测试方式)。如果您是控制台或表单应用程序,则恢复是另一回事,因为可以向用户显示异常,并且用户可以交互地确定适当的操作。

我的一般建议是:尽可能在源头附近捕获特定的异常,让其余的气泡冒出栈,并在您有足够的上下文记录该异常的位置,以便以后尝试并再现异常。警惕先捕再投昂贵。在您的示例中,您可能想要执行此操作的场景是,例如,如果SmtpException是连接超时(我正在解决),那么一种策略可能会指数递减,并且自发送邮件以来最多重试n次服务器可能已关闭,如果没有成功,则最终放弃并重新抛出。

真正简短的答案是:这取决于一切。

10-06 13:32
查看更多