8

方法一:

public static void SendMail(string from, string to, string subject, string body)
{
   if(String.IsNullOrWhiteSpace(from))
      throw new ArgumentNullOrWhiteSpaceException("from");

   if(String.IsNullOrWhiteSpace(to))
      throw new ArgumentNullOrWhiteSpaceException("to");

   var msg = new MailMessage(from, to, subject, body) { IsBodyHtml = true };

   using(var smtp = new SmtpClient())
      smtp.Send(msg);
}

方法二:

public static void SendMail(string from, string to, string subject, string body)
{
   var msg = new MailMessage(from, to, subject, body) { IsBodyHtml = true };

   using(var smtp = new SmtpClient())
      smtp.Send(msg);
}

为什么我要验证方法 1 中的参数,而不是等待MailMessage抛出异常(方法 2),告诉我我已将空值fromto值传递给构造函数?

那么我为什么要抛出自己的异常呢?

4

4 回答 4

4

这样做的原因很简单——它使调试更容易。

对于需要非空参数的任何给定方法(更复杂的方法更是如此),调试异常场景的人会更容易看到显式异常,因为SendMail说:“嘿,'from' is null ; 我不需要它,”而不是在其中有一些方法调用SendMail(甚至是其中的一些嵌套方法调用)抛出一个 NullReferenceException (最终,如果所讨论的方法都没有执行空检查会发生什么)。

然后,您会遇到这样的情况 - 6 个月后 - 您决定SendMail需要做其他事情;例如(作为一个简单的例子)在数据库中设置某种审计标志。现在,如果你只是让方法失败,你有一个无效的标志(或者你可能会这样做,这取决于你的方法中事物的顺序)。最好说“实际上,如果我的参数无效,请立即失败”,而不是让方法继续执行并产生潜在的副作用。

于 2013-09-23T07:47:14.997 回答
1

一般来说,我认为抛出你自己的异常是合理的,因为你可以提供比你正在调用的函数更多的相关信息(或者在你的代码中处理更具体的异常,或者向用户返回更好的错误消息)。

在这种情况下,您似乎不会添加任何无法添加的信息Send()

于 2013-09-23T07:47:55.543 回答
1

smtp.SendMail 将抛出 InvalidOperationException(在系统命名空间中)

在这个你抛出一个更合适的异常类型,从类型类型更容易理解和捕获异常。InvalidOperationException 是一个非常通用的类。通过抛出您自己的异常,代码更具可读性,即使您稍后更改方法(例如使用另一个邮件客户端)也可以处理相同的异常。

于 2013-09-23T07:59:01.403 回答
0

呃……你确定 100%var msg = new MailMessage(from, to, subject, body) { IsBodyHtml = true };

会抛出那些异常吗?方法 2 是 未定义的行为。这应该如何进行单元测试?

SendMail("","","") 做什么?确切地说?从第二种方法中不清楚。

你可以添加评论。但为什么?那不是干净的代码

arroach 1 清楚地定义了函数将失败的位置。以及它将如何处理故障。您的代码应该清楚说明是做什么的,而不是注释。

附言

扔新的ArgumentNullOrWhiteSpaceException("from");被扔在您的 SendMail 函数中,最接近问题的根源。

如果您使用方法 2,只有上帝知道您的呼叫雇佣关系有多深,如果有的话,它会被抓住。

您也可以通过编写以下内容来改善这一点:

ArgumentNullOrWhiteSpaceException("from - this is usually caused if poo is not bared by poo in goo"); ` 这可以在几个月后简化你的生活。

于 2013-09-23T07:47:32.257 回答