В приложении 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 или вообще.
Я использовал службу обмена сообщениями в своем презентаторе при отображении сообщений об ошибках.
Означает ли это смысл? Может ли это быть упрощено?
Вы возвращаете 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);
}