异常处理:精细程度,当涉及到参数验证你会去?(Exception handling: how gra

2019-07-29 22:19发布

我编码与单一方法的简单的小类发送电子邮件。 我的目标是实现它在传统的Visual Basic 6项目中,露出它通过COM互操作设备的COM对象。

有一个细节我发现很难解决,这是我应该怎么颗粒是在参数验证。 在光,我真的不开心,和一个东西是不是一个细节可言,就是我其实异常处理的方式:

public class MyMailerClass
{
    #region Creation
    public void SendMail(string from, string subject, string to, string body)
    {
        if (this.IsValidMessage(from, subject, to, body)) // CS1501
        {
            MailMessage msg = new MailMessage();
            msg.IsBodyHtml = true;
            msg.From = new MailAddress(from);
            msg.To.Add(to);
            msg.Subject = subject;
            msg.Body = body;
            SmtpClient srv = new SmtpClient("SOME-SMTP-HOST.COM");
            srv.Send(msg);
        }
        else
        {
            throw new ApplicationException("Invalid message format.");
        }
    }
    #endregion Creation

    #region Validation
    private bool IsValidMessage(string from, string subject, string to, string body)
    {
        Regex chk = new Regex(@"(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})");
        if (!chk.IsMatch(from))
        {
            return false;
        }
        if (!chk.IsMatch(to))
        {
            return false;
        }
        if (!string.IsNullOrEmpty(subject))
        {
            return false;
        }
        if (!string.IsNullOrEmpty(body))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    #endregion Validation
}

任何建议将非常感激, 感谢这么提前为所有您的意见!

:难道是实现企业图书馆的便利验证应用程序块在这种特殊情况下?

Answer 1:

想想看,你的SendMail时的调用者强加的合同。 他们需要通过你一个“有效的电子邮件地址”。 谁决定什么是有效的? Sendmail的一样。 基本上,你的方法是“高维护” - 它想要的东西正是它喜欢的方式,并告诉你是否打算给它会是令人满意的是尝试和最好的希望的唯一途径。

不要写高维护的方法没有给发话有机会知道如何去满足它,或者至少有办法避免该异常。 提取验证逻辑到返回一个布尔一个“IsValidAddress”的方法。 然后让你的SendMail方法调用IsValidAddress并抛出,如果它是无效的。

你从这种变化几个不错的效果:

(1)增加的关注点分离。 sendmail的任务是让电子邮件机构工作,而不是通过一个电子邮件地址是否有效的判断。 隔离到专门的验证代码决策。

(2)地址验证是在其本身的有用工具; 当你想知道是否一个地址,而不发送邮件到它良好的形成有很多次。

(3)您可以更新和轻松地提高您的验证逻辑,因为它是在同一个说理的地方。

(4)主叫方有办法,他们可以保证没有会抛出异常。 如果呼叫者不能调用方法不保证该参数是有效的,那么他们必须抓住例外。 理想情况下,你不应该让呼叫者必须处理异常让自己的代码正确的; 应该有,他们可以写正确的代码,不会抛出的方式,即使他们已经流传的数据是不好的。

下面是我写关于这个问题,你可能会发现有用的一对夫妇的文章:

异常处理: http://ericlippert.com/2008/09/10/vexing-exceptions/

高保养方法: http://blogs.msdn.com/ericlippert/archive/2008/09/08/high-maintenance.aspx



Answer 2:

有两个throw连续的语句是没有SENCE -只有第一个会被执行,然后控制就会被传递到异常处理程序,从来没有到第二throw

在我看来,这是绰绰有余,只是说像水木清华“发件人的电子邮件是无效的。” 电子邮件是非常简单和短,这样用户就能够解决这个没有任何进一步的指导。

我也认为这将是最好先检查所有的值传递,然后才开始工作。 是什么在部分做的工作,如果你就可以遇到一个无效的参数值,并抛出一个异常,并且永远不会完成这项工作的地步。 尽量早,你可以指出错误 - 在开始的时候如果可能的话。



Answer 3:

和:

使用

string.IsNullOrEmpty(subject)

而不是

subject == null

检查,如果你的字符串是空的。



文章来源: Exception handling: how granular would you go when it comes to argument validation?