繁体   English   中英

如何以DRY方式将未处理的程序异常通知管理员?

[英]How can I notify administrators of unhandled program exceptions in a DRY way?

我有几个每天运行一次的服务器端进程。 如果有人通过电子邮件通知我,我希望得到通知。 我不需要重写捕获异常并发送电子邮件的代码,因为每次的代码几乎相同。

我实际上已经为此实现了一个初始解决方案。 我创建了一个类,其中包含要通知的人员的电子邮件地址以及该过程的名称。 我正在使用委托来允许用户传递对无参数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(); 

为此,通常使用委托。

另一种解决方案是类似于PostSharp的 面向方面的编程(AOP) 这是一个如何执行此操作的小示例: 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM