Обработка исключений в DAL

1

В приложении winforms MVP я обрабатываю исключения в DAL следующим образом.

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

Не могли бы вы показать мне стандартный способ сделать это?

    public bool InsertAccount(IBankAccount ba)
    {
        string selectStatement = @"IF NOT EXISTS (SELECT ac_no FROM BankAccount WHERE ac_no=@ac_no) BEGIN INSERT INTO BankAccount ...";

        using (SqlConnection sqlConnection = new SqlConnection(db.ConnectionString))
        {
            using (SqlCommand sqlCommand = new SqlCommand(selectStatement, sqlConnection))
            {
                try
                {
                    sqlConnection.Open();
                    sqlCommand.Parameters.Add("@ac_no", SqlDbType.Char).Value = ba.AccountNumber;
                    //
                    //

                    sqlCommand.ExecuteNonQuery();
                    return true;
                }
                catch (Exception e) { MessageBox.Show(("Error: " + e.Message)); }
                if (sqlConnection.State == System.Data.ConnectionState.Open) sqlConnection.Close();
                return false;
            }

        }
    }

EDIT2:

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

DAL

public bool InsertAccount(IBankAccount ba)
{
    try
    {
        sqlConnection.Open();
        //   
    }
    catch (SqlException)
    {
        throw new Exception("DataBase related Exception occurred");
    }
    catch (Exception)
    {
        throw new Exception("Exception occurred");
    }
}

BankAccountPresenter

    private void SaveBankAccount()
    {
        try
        {
           _DataService.InsertAccount(_model);
        }
        catch (Exception e) { MessagingService.ShowErrorMessage(e.Message); }
    }

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

И также таким образом я могу различать массивы ошибок в DAL, независимо от того, связан ли он с sql или вообще.

Я использовал службу обмена сообщениями в своем презентаторе при отображении сообщений об ошибках.

Означает ли это смысл? Может ли это быть упрощено?

  • 1
    К вашему сведению, при заключении соединения в использование нет необходимости закрывать соединение. Использование автоматически закроет соединение, даже если есть исключение. Смотрите этот вопрос.
  • 0
    @ Аарон Карлсон, понял
Показать ещё 4 комментария
Теги:
exception-handling
mvp

1 ответ

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

Вы возвращаете false, чтобы указать, что произошло исключение. Это не рекомендуется.

Повторить

catch(Exception e) {
  //blah, maybe add some useful text to e
   throw;
}
finally { //close up shop Although, look up what using does first incidentally }

Затем обработайте его (catch (Exception e) { MessageBox.Show(("Error: " + e.Message)); }) на более высоком уровне.

Отклик на EDIT2:

Это здорово. Однако ваша текущая реализация выдает "фактическое" исключение и трассировку стека в корзине в пользу вашего полезного сообщения. Вы должны добавить его как внутреннее исключение, например:

catch(Exception e){    
     throw new Exception("some helpful message", e);
}
  • 2
    Действительно, специальное замечание для использования 'throw;' вместо «бросить экс;» сохранить трассировку стека.
  • 0
    @ L-Three Вот почему я разместил код. Возможно это должно было быть явным. Это ловушка наверняка. throw e сбрасывает параметры, такие как Exception.StackWalk
Показать ещё 6 комментариев

Ещё вопросы

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