Обработка исключений с помощью выражения лямбда

1

Мой DAL не обрабатывает исключения, и он будет распространяться до вызывающего метода в классах презентатора, где будет обрабатываться исключение.

Я использую один обработчик под названием ExecutAction(Action action) поэтому я улавливаю исключения в одном месте, а не повторяю в каждом методе.

На данный момент я не регистрирую ошибки. Просто предупреждайте пользователя о действии и старайтесь поддерживать работоспособность системы, если это возможно.

При показе сообщений пользователям Презентаторы будут использовать статический класс MessagingService. (ShowErrorMessage()). Так что я могу настроить все массажные боксы в одном месте.

        private void Search()
        {
            ExecutAction(() =>
            {
                var info = _DataService.GetByACNo(_model.AccountNumber);

                    if (info != null)
                    {
                        _Model = info ;
                        this.SetViewPropertiesFromModel(_Model, _View);
                    }
                    else
                    {
                        MessageBox.Show ("Bank account not found");
                    }
                });
            }


            private void ExecutAction(Action action)
            {
                try
                {
                    action();
                }

                catch (NullReferenceException e) { MessagingService.ShowErrorMessage(e.Message); }
                catch (System.Data.SqlTypes.SqlTypeException e) { MessagingService.ShowErrorMessage(e.Message); }
                catch (System.Data.SqlClient.SqlException e) { MessagingService.ShowErrorMessage(e.Message); }
            }
        }

Должен ли я включать в себя общий обработчик исключений, чтобы иметь возможность обрабатывать любые непредвиденные исключения?

Также вы могли бы показать мне лучший способ обработки сообщений, чем использование статики?

Использует ли лямбда-выражения в каждом вызове метода (ExecutAction(() =>) ухудшает читаемость кода?

При показе пользовательских сообщений, как сначала показывать пользовательское сообщение, например "Проверить соединение с сервером" и т.д., А затем, если пользователь хочет получить больше информации (например, StackTrace/технические данные), он может нажать кнопку " More Info которая находится в MessageBox диалог?

Теги:
exception-handling
lambda
mvp

2 ответа

2
Лучший ответ

Я согласен с Джеффри в попытке включить IoC для вашего обслуживания сообщений. Вы можете определить класс абстрактного базового презентатора, который имеет зависимость от интерфейса для вашего сервиса сообщений. Базовый класс будет отвечать за обработку делегирования делегата + исключение.

public interface IMessageService
{
    void ShowErrorMessage(Exception e);
}

public abstract class PresenterBase
{
    private readonly IMessageService _messageService;

    public PresenterBase(IMessageService messageService)
    {
        this._messageService = messageService;
    }

    protected void ExecuteAction(Action action)
    {
        try
        {
            action();
        }

        catch (Exception e) { this._messageService.ShowErrorMessage(e); }
    }
}

public class SearchPresenter: PresenterBase
{
    public SearchPresenter(IMessageService messageService)
        : base(messageService)
    {
    }

    public void Search()
    {
        this.ExecuteAction(() =>
        {
            //perform search action
        });
    }
}

Что касается вашего вопроса об улавливании всех исключений. Если вы не делаете что-то особенное для определенных типов исключений, я бы предложил просто работать с тем же. В приведенном выше примере предоставляется исключение для службы сообщений, так что специфические особенности форматирования могут обрабатываться службой сообщений.

Если вы еще не включили какой-либо контейнер IoC, вы всегда можете начать с использования инъекции интерфейса, а затем передать экземпляр явно из конструктора дочернего класса.

public class SearchPresenter: PresenterBase
{
    public SearchPresenter()
        : base(new SomeMessageService())
    {
    }

    ...
}

Это, по крайней мере, устраняет статическую зависимость и не является слишком сложной для замены позже, если вы когда-либо вводите контейнер IoC.

2

Я думаю, что ваш подход достаточно хорош для вашей работы. ExecuteAction логики ExecuteAction является приемлемым для меня способом. В качестве другого варианта я мог бы использовать AOP для централизованной обработки исключений на практике.

Кроме того, я мог бы использовать MessagingService разрешенный из контейнера инъекций зависимостей, а не статический.

Что касается того, как отображать ошибку, это полностью зависит от вашей бизнес-цели. Например, вы можете просто зарегистрировать ошибку и сказать пользователю "что-то не так" или показать им полную стек, включая информацию об окружающей среде, чтобы они могли просто скопировать и вставить в электронное письмо.

  • 0
    Что касается обмена сообщениями, я думаю показать оба сообщения (пользовательское и техническое) в одном и том же окне сообщения. Только если пользователь является администратором, он / она может нажать кнопку « More Info в том же окне сообщения. тогда он будет отображать технические детали рядом с предыдущим! Это приемлемый способ?
  • 0
    Ну, это нормально для меня, но я думаю, что вы все равно должны подтвердить требование или поддержку людей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню