C# 如何以一种干燥的方式通知管理员未处理的程序异常?

C# 如何以一种干燥的方式通知管理员未处理的程序异常?,c#,email,exception,C#,Email,Exception,我有几个每天运行一次的服务器端进程。如果其中任何一个失败,我希望通过电子邮件通知我。我不想重写捕获异常并发送电子邮件的代码,因为每次的代码几乎相同 实际上,我已经实现了这个问题的初始解决方案。我创建了一个类,其中包含要通知的人的电子邮件地址以及流程的名称。我使用委托允许用户传入对无参数void函数的引用 我认为这会奏效,但这是最好的方法吗?这是我应该做的还是有更好的方法来处理错误?我曾想过使用C#类属性,但我不确定如何实际使用属性元数据来实现这一目标 public class ErrorNoti

我有几个每天运行一次的服务器端进程。如果其中任何一个失败,我希望通过电子邮件通知我。我不想重写捕获异常并发送电子邮件的代码,因为每次的代码几乎相同

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

为此,使用代理是一种常见做法

另一种解决方案是面向方面编程(AOP)like。 下面是一个小示例,说明如何执行此操作:

我认为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);
        }
    }
}
然后为每个“Processorun”创建子类

现在,您可以简单地运行子类:

new Process1().Run();

谢谢,我认为继承选项更优雅,所以我同意。
new Process1().Run();