方法一:
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);
}
方法 2:
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),告诉我我已经传递了一个空的 from
或到
值,到构造函数?
那么我为什么要抛出自己的异常呢?
最佳答案
这样做的原因很简单——它更容易调试。
对于需要非空参数的任何给定方法(对于更复杂的方法更是如此),调试异常场景的人会更容易看到来自 SendMail
的显式异常> 说,“嘿,'from' 是 null;我不需要它是,”而不是在 SendMail
中进行一些方法调用(或者甚至是其中的一些嵌套方法调用)抛出 NullReferenceException (最终,如果所讨论的方法都不执行空值检查,将会发生什么)。
然后,您遇到这样一种情况 - 6 个月后 - 您决定 SendMail
需要做其他事情;例如(作为一个简单的例子)在数据库中设置某种审计标志。现在,如果您只是让该方法失败,则您有一个无效标志(或者您可能会这样做,具体取决于您的方法中事物的顺序)。更好的说法是“实际上,如果我的参数无效,就立即失败”,而不是让该方法继续进行并产生潜在的副作用。
关于c# - 参数验证,还是让它失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18953989/