我有几个每天运行一次的服务器端进程。如果有人通过电子邮件通知我,我希望得到通知。我不需要重写捕获异常并发送电子邮件的代码,因为每次的代码几乎相同。
我实际上已经实现了一个初步的解决方案。我创建了一个类,其中包含要通知的人员的电子邮件地址以及该过程的名称。我正在使用委托来允许用户传递对无参数void函数的引用。
我认为这会起作用,但这是最好的方法吗?这甚至是我应该做的事情,还是有更好的错误处理方法?我曾考虑过使用C#类属性,但不确定如何实际使用属性元数据来实现此目标。
public class ErrorNotifier
{
string _processName;
string _administratorEmail;
RunProcess _runProcess;
public ErrorNotifier(string processName, string administratorEmail, RunProcess runProcess)
{
_processName= exportName;
_administratorEmail = administratorEmail;
_runProcess = runProcess;
}
public void Run()
{
try
{
_runProcess();
}
catch (Exception ex)
{
SendErrorMessage(ex);
}
}
protected void SendErrorMessage(Exception ex)
{
SmtpClient client = new SmtpClient(serverName);
MailMessage msg;
string errorEmail = _administratorEmail;
msg = new MailMessage(FormatStringStripNonAlphaNumeric(_processName) + "@business.com", errorEmail, "Error encountered during " + _processName+ " process", ex.ToString());
client.Send(msg);
}
public delegate void RunProcess();
}
然后我用类似这样的东西来调用它:
new ErrorNotifier(exportName,administratorEmail, ProcessToRun).Run();
答案 0 :(得分:1)
为此,通常使用委托。
另一种解决方案是面向方面的编程(AOP),例如PostSharp。 这是一个小例子,该如何做:https://www.experts-exchange.com/articles/24979/DRY-Exception-Handling-with-PostSharp.html
我认为OOP中最好的方法是使用继承。只需创建一个带有异常处理的抽象类:
public abstract class ErrorNotifier
{
string _processName;
string _administratorEmail;
public ErrorNotifier(string processName, string administratorEmail)
{
_processName = processName;
_administratorEmail = administratorEmail;
}
public abstract void RunProcess();
public void Run()
{
try
{
RunProcess();
}
catch (Exception ex)
{
SendErrorMessage(ex);
}
}
}
,然后为每个“ ProcessToRun”创建子类
public class Process1 : ErrorNotifier
{
public override void RunProcess()
{
// Implement the method
}
}
现在您可以简单地运行子类:
new Process1().Run();