Как обрабатываются исключения при проектировании DataLayer или любой другой многоуровневой архитектуры - PullRequest
0 голосов
/ 08 июля 2010

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

РЕДАКТИРОВАТЬ

private void OpenConnection()
        {
                if (ConnectionState.Closed == _connection.State)
                    _connection.Open();
        }

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

Но я использую эту функцию в DL только с другой строкой кода.

protected DataTable GetDataTable(string Query)
 {
     DataTable dt =new DataTable();
     SqlCommand cmd = InitializeCommand(Query);

     SqlDataAdapter adp = new SqlDataAdapter(cmd);
     try
     {
         OpenConnection();
         adp.Fill(dt);
         CloseConnection(true);
         return dt;
     }
     catch (SqlException ex)
     { throw ex; }
     finally
     {
         adp.Dispose();
         cmd.Dispose();
     }
 }

Теперь, если исключение возникает в OpenConnection() при попытке открыть соединение, тогда приложение падает на линии throw ex в самом OpenConnection, в то время как я ожидал, что оно возвратит исключение. Как я должен справиться с этой проблемой. Более того, расширив мой вопрос во второй функции GetDataTable, если возникает исключение, какое исключение следует выдать с теми же деталями, которые произошли в этот момент и как. Я знаю только это, но я думаю, что это вонг.

throw new ApplicationException(ex.message,ex.innerexception)

Редактировать

Предположим, соединение с сервером прервано или я использую неверную строку соединения. Сейчас я использую функцию GetDataTable из BL. Где произойдет исключение и где я должен его обработать? Я хочу знать проблему, которая произошла в DL. Учитывая BL не знаю код DL

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Есть несколько вещей, которые вы можете сделать.

Вы можете иметь различные блоки try и выдавать новые исключения в зависимости от того, где у вас возникла проблема:

 try
 {
     OpenConnection();
     adp.Fill(dt);
 }
 catch (SqlException ex)
 { throw new SqlException("Could not open/populate", ex); }
 finally
 {
     adp.Dispose();
     cmd.Dispose();
 }

 try
 {
     CloseConnection(true);
     return dt;
 }
 catch (SqlException ex)
 { throw new SqlException("Could not close connection", ex); }
 finally
 {
     adp.Dispose();
     cmd.Dispose();
 }
0 голосов
/ 08 июля 2010

Мое предложение будет удалить перехват и переброс, так как это уничтожит трассировку стека исключительной ситуации.Вы можете попробовать без улова, так как вы все равно выбрасываете исключение.Таким образом, вы можете сохранить трассировку стека и по-прежнему использовать finally:

protected DataTable GetDataTable(string Query)
 {
     DataTable dt =new DataTable();
     SqlCommand cmd = InitializeCommand(Query);

     SqlDataAdapter adp = new SqlDataAdapter(cmd);
     try
     {
         OpenConnection();
         adp.Fill(dt);
         CloseConnection(true);
         return dt;
     }
     finally
     {
         adp.Dispose();
         cmd.Dispose();
     }
 }
...