c# - 参数验证,还是让它失败?

标签 c#

方法一:

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/

相关文章:

c# - 从字符串列表中返回潜在字符串及其下一个字符性能

c# - Azure WebJob 部署问题

c# - value.(entityname) 取的值是多少?

c# - 如何每 24 小时在 Asp.net MVC 中执行一个方法

c# - 如何确保 MonoBehaviour 对象在另一个 Actor 想要访问它之前加载了它的数据?

c# - 使用深度数据 - Kinect

c# - 初始化静态数组的正确语法

c# - 通用自定义 linq 过滤器

c# - 谷歌地图 Api 与 C# 的 Bing map

c# - 使用 Visual Studio 以不同语言运行 C# 应用程序