Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#SmtpClient.Send()-是否有处理异常的备选方案(或配套方案)?_C#_Exception - Fatal编程技术网

C#SmtpClient.Send()-是否有处理异常的备选方案(或配套方案)?

C#SmtpClient.Send()-是否有处理异常的备选方案(或配套方案)?,c#,exception,C#,Exception,(苏的老读者,第一次问问题 我是C语言的新手,已经在PHP/Ruby/Python领域工作多年,如果这是一个愚蠢的问题,我很抱歉。) 我正在对一个旧的C#应用程序进行维护,每当SmtpClient.Send()失败时,它就会崩溃。从我从MSDN中收集到的一些信息中,我可以看出解决这个问题的明显方法,但我的问题也涉及到更一般的情况 根据MSDN: try { client.Send(message); } catch (Exception ex) {

(苏的老读者,第一次问问题

我是C语言的新手,已经在PHP/Ruby/Python领域工作多年,如果这是一个愚蠢的问题,我很抱歉。)

我正在对一个旧的C#应用程序进行维护,每当SmtpClient.Send()失败时,它就会崩溃。从我从MSDN中收集到的一些信息中,我可以看出解决这个问题的明显方法,但我的问题也涉及到更一般的情况

根据MSDN:

  try {
          client.Send(message);
  }  
  catch (Exception ex) {
          Console.WriteLine("Exception caught in CreateTestMessage2(): {0}", 
                ex.ToString() );
  }
这一切对我来说都是有道理的,但我也一直认为,只要你能防止可能的错误,你就这样做。您是否可以(也应该)在这里做些什么来减少Send()抛出异常的可能性

我假设在某些情况下,不可能防止出现异常的可能性,因此您必须处理它,但是否有人们用来指导他们的通用样式指南或规则

再一次,如果这是一个垃圾问题,我很抱歉。我尽可能多地搜索SO和Google

编辑:我刚刚发现了这个问题 这可能会在某种程度上回答我的问题

EDIT2:谢谢你的及时反馈,速度非常快。我一直在思考这个问题,也许这可以进一步完善我的问题

说某些异常(如SmtpException)确实无法避免是正确的吗?如果说使用诸如SmtpException之类的异常来告诉您发送出了问题,而您只是按照自己的意愿处理它,这是正确的方式吗


我觉得这个问题听起来有点模糊,但我这么问是因为我能学到的任何东西都有利于我的自信。

通过阅读MSDN,您可以看到.Send()方法引发的异常列表以及引发异常的简要原因。在调用Send()之前检查并处理这些异常有助于避免它们,但文档并不一定涵盖所有可能的异常或它们发生的原因


不过你走的路是对的;如果可能的话,您希望避免创建异常,这是正确的。如果没有其他原因,它们的创建和处理对于运行时来说是相当昂贵的——如果它们没有得到处理,即使是一个简单的异常也会导致整个应用程序崩溃。

这些异常本身并不是很糟糕。它们是防御性编程策略的一部分。您将从捕获的异常中获得有关发送崩溃原因的宝贵知识。您可以使用它来解决问题。

当发生异常错误时,抛出异常完全可以,因此代码没有问题。如果SMTP服务器关闭或电子邮件地址无效或出现其他错误,则希望它抛出,而不是静默失败


您是否希望在发送周围立即使用try块取决于您是否需要在此处执行任何操作。否则,您也可以让它冒泡到最常用的try块。

捕获异常时,如果您知道调用的方法会出现什么样的异常,请尽可能具体。例如,这将允许诸如OutOfMemoryException之类的错误继续在堆栈中冒泡,然后应用程序将很快失败(这可能是一件好事,因为您的系统现在处于未知状态,您不应该继续)

然而,在这方面有不同的学派;在某些情况下(假设您是NT服务),您希望应用程序具有高可用性,并且由于在某些不可预见的代码路径上出现NullPointerException而导致生产崩溃可能是不可取的,只要该异常被记录,并且您有能力发布QFE(更不用说修改您的测试制度)。如果您是一个控制台或表单应用程序,那么恢复是另一回事,因为异常可能会向用户显示,用户可以交互地决定适当的操作

我的一般建议是:捕获尽可能靠近源代码的特定异常,让其余异常冒泡到堆栈中,并在您有足够上下文的位置记录它,以便稍后尝试重新编译异常。要小心,接住然后再扔是昂贵的;在您的示例中,如果SmtpException是一个连接超时(我在编这个),您可能希望这样做,那么一种策略可能是指数级后退,并重试多达n次,因为邮件服务器可能会关闭,然后如果不成功,最后放弃并重试


真正简短的回答是:这要看情况而定。

这是我所说的“外生”异常情况的一个很好的例子

考虑一个类似的情况——打开一个文件。您可以通过以下方式减少获得异常的机会:

  • 检查文件是否存在
  • 检查用户是否具有打开文件的权限
  • 检查其他应用程序是否已锁定该文件
  • 废话
  • 废话
  • 废话废话
您可以执行所有这些操作,但在打开文件时仍会出现异常。因为在执行所有这些检查和尝试打开文件之间,可能发生了一些变化。另一个进程可能更改了权限,或锁定了文件,或用户从驱动器中删除了CD-ROM,或其他。动作是否成功取决于一种外生的、真实的条件,而你无法以任何保证的方式进行测试

外部异常是一个很难处理的问题,因为即使您做了大量工作来消除它们,您也必须处理它们

发送邮件也是这样。您可以检查各种情况以尝试消除异常,这可能会在99%的时间内有效,但您仍然无法保证在所有检查和实际尝试发送邮件之间,有人没有拔下ro