Передать исключение в BLL и вернуть клиенту (либо winforms, либо webforms)? - PullRequest
1 голос
/ 29 апреля 2009

Я ищу лучший способ обработки исключений, например ... когда возникает ошибка на уровне бизнес-логики, является ли лучший способ остановить МЕТОД с помощью перехвата и вернуть СОБЫТИЕ на уровень представления?

Что должно содержать это событие?

Или я всегда должен выдавливать исключения и обрабатывать их на уровне представления?

Любой имеет хорошие ссылки и требует прочтения по этому вопросу в отношении лучшего способа обработки исключений и способов их обработки в клиенте ...

Например, если я получаю исключение NullException в BLL, чем я смогу это уловить ... но как лучше и вернуться к уровню представления и сообщить ему о проблеме ..

Событие? или другая попытка / поймать в презентации?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2009

Есть несколько способов сделать это:

1) Выдача исключений с описанием сообщения внутри.

2) Огневые события

3) Использование специальных интерфейсов для взаимодействия с пользователем.
Например, вы можете реализовать нечто вроде интерфейса IUiCallbacks и отправить объект, реализующий этот интерфейс, в класс или метод BLL. Позже, метод в BLL может вызвать IUiCallbacks.SendMessage () или IUiCallbacks.SendError (), чтобы уведомить презентацию. И у вас могут быть разные классы, такие как WinFormsUiCallbacks, WebFormsUiCallbacks и SilentUiCallbacks, реализующие этот интерфейс.

Я обычно использую 1) и 3)

Пример 3) по запросу:

public interface IUiCallbacks
{
  void SendMessage(string message);
  void SendException(string message, Exception ex);
}

public class WinFormsUiCallbacks : IUiCallbacks
{
  public void SendMessage(string message)
  {
    MessageBox.Show(message);
  }

  public void SendException(string message, Exception ex)
  {
    MessageBox.Show(string.Format("Unfortunately, the following errror has occurred:{0}{1}", Environment.NewLine, ex.Message));
  }
}

public class OrderService
{
  private IUiCallbacks _iUiCallbacks;
  ...
  public OrderService() { ... }
  public OrderService(IUiCallbacks iUiCallbacks)
  {
    _iUiCallbacks = iUiCallbacks;
  }
  ...
  public void AddOrder(Order order)
  {
    ...
    if(OrderAlreadyExists(order))
    {
      if(_iUiCallbacks != null)
        _iUiCallbacks.SendMessage("The order can not be added, because it is already accepted.");
      return;
    }
    ...
  }
  ...
}

Так что его можно использовать так:

public partial class OrderForm : Form
{
  ...
  public void btnAddOrderFromExcel_Click(...)
  {
    Order order = LoadOrderFromExcel(...);
    OrderService orderService = new OrderService(new WinFormsUiCallbacks());
    orderService.AddOrder(order);
  }
  ...
}
0 голосов
/ 29 апреля 2009

Вы можете сделать несколько вещей;

  1. Сосредоточьтесь на улучшении работы пользователя при возникновении непредвиденной ошибки.

  2. Всегда регистрировать ошибки либо в журнале событий, либо в базе данных.

  3. Реализация достаточной инфраструктуры, чтобы не допустить возникновения исключений, если они не являются системными исключениями.

  4. Использовать экземплярную строку броска исключения броска

Некоторые ссылки, которые помогут вам :

  1. http://today.java.net/pub/a/today/2003/12/04/exceptions.html

  2. http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html

  3. http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx

...