Как я могу уведомить администраторов о необработанных исключениях программы в СУХОЙ форме? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть несколько серверных процессов, которые запускаются один раз в день.Я хотел бы получить уведомление, если любой из них не удастся по электронной почте.Я не хочу переписывать код, который перехватывает исключение и отправляет сообщение электронной почты, поскольку каждый раз это почти один и тот же код.

Я уже реализовал первоначальное решение для этого.Я создал класс, который содержит адрес электронной почты человека, которого нужно уведомить, а также имя процесса.Я использую делегат, чтобы позволить пользователю передать ссылку на функцию 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(); 

1 Ответ

1 голос
/ 09 июля 2019

Использование делегата является обычной практикой для этого.

Другим решением будет Аспектно-ориентированное программирование (AOP) подобно PostSharp .Вот небольшой пример, как это сделать: https://www.experts -exchange.com / Articles / 24979 / DRY-Exception-Handling-with-PostSharp.html

Я думаю, что лучший подходв ООП стоит использовать наследование.Просто создайте абстрактный класс с обработкой исключений:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...