gpt4 book ai didi

c# - 异常处理 : how granular would you go when it comes to argument validation?

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:26 24 4
gpt4 key购买 nike

我正在用一个方法编写一个简单的小类,发送电子邮件。我的目标是在遗留的 Visual Basic 6 项目中实现它,通过 COM Interop 工具将其作为 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
}

任何建议将不胜感激,因此提前非常感谢您的所有评论!

注意:实现企业图书馆的Validation Application Block会方便吗?在这个特殊情况下?

最佳答案

考虑您强加给 SendMail 调用者的契约。他们需要向您传递一个“有效的电子邮件地址”。谁决定什么是有效的?发送邮件。基本上你的方法是“高维护”——它想要的东西完全按照它喜欢的方式,判断你要给它的东西是否令人满意的唯一方法是尝试并希望最好的。

如果调用者没有机会知道如何满足它,或者至少有办法避免异常,就不要编写高维护方法。将验证逻辑提取到返回 bool 值的“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

关于c# - 异常处理 : how granular would you go when it comes to argument validation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1102030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com