2016-07-13 4 views
-1

Ниже приведен код в пользовательских интерфейсах, BLL и DAL. BLL должен обрабатывать исключение, если есть какая-либо проблема в выполнении запроса DAL и показ пользователю с общим сообщением. Мы используем Elmah для обработки ошибок. Кто-нибудь может предложить, как обрабатывать исключение и показывать пользователю общую страницу сообщений (например, ошибку 500).Обработка исключений через elmah

Контроллер

refNo = _formServiceWorker.SubmitFormData(formData, isFinalized); 

Business Logic Layer:

public string SubmitFormData(GenericFormData formData, bool isFinalized) 
{    
     var submissionHeaderDTO = new SubmissionHeaderDTO(); 
     submissionHeaderDTO = SubmissionHeader(formData.FormId, submissionHeaderVariablesDTO); 

     var formFieldDataList = GetFormFieldData(formData, submissionHeaderDTO); 

     if (formFieldDataList.Count() > 0) 
     {      
      this._formDataService.DeleteFormData(submissionHeaderDTO.SubmissionId); // calls Data Access Layer 

      foreach (var formField in formFieldDataList) 
      {       
        this._formDataService.SubmitFormData(formField); //Calls Data Access Layer 
      } 
     } 
    } 
    return submissionHeaderDTO.SubmitSequence; 
} 

Data Access Layer

public SubmissionHeaderDTO GetRefNo(SubmissionHeaderVariablesDTO requestVariables) 
{ 
    using(var sqlConn = new SqlConnection(Configuration.DBConnection)) 
    { 
     sqlConn.Open();     
     using (var sqlcmd = new SqlCommand("usp_testSubmissionHeaderInsert", sqlConn)) 
     { 
      sqlcmd.CommandType = CommandType.StoredProcedure; 
      sqlcmd.Parameters.Add("@FormId", SqlDbType.UniqueIdentifier).Value = requestVariables.FormId; 

      SqlParameter outputSubmissionSequence = new SqlParameter("@SubmitSequence", SqlDbType.NVarChar, 30) 
      { 
       Direction = ParameterDirection.Output 
      }; 

      SqlParameter outputFormGuid = new SqlParameter("@FormIdGuid", SqlDbType.UniqueIdentifier) 
      { 
       Direction = ParameterDirection.Output 
      }; 

      sqlcmd.Parameters.Add(outputSubmissionSequence); 
      sqlcmd.Parameters.Add(outputFormGuid); 

      sqlcmd.ExecuteNonQuery(); 

      var submissionHeaderDto = new SubmissionHeaderDTO() 
      { 
       SubmissionId = (Guid)outputSubmissionId.Value, 
       SubmitSequence = outputSubmissionSequence.Value.ToString(), 
       FormId = (Guid)outputFormGuid.Value 
      }; 
      return submissionHeaderDto; 
     } 
    } 
} 

ответ

0

Вам нужно будет обернуть полный код (или просто sqlcmd.ExecuteNonQuery() как ваша потребность) в слое доступа к данным с блоком try-catch и выбрасывать пользовательское исключение (например: специальный класс исключения DataAccessLayerException). Затем в вашем коде контроллера вы должны добавить блок try-catch, обработать настраиваемое исключение, выведенное из уровня доступа к данным, и показать пользователю общую страницу сообщений (например, ошибку 500).

0

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

Что вы не должны делать (imo), это обрабатывать ошибки db во всем коде вашего сайта и делать что-то обычное, например перенаправление на страницу с ошибкой или simiar. Вот для чего предназначены страницы с ошибками. Это очень сложный вопрос, но есть хорошая документация для его настройки. Самый лучший, который я нашел, - Demystifying ASP.NET MVC 5 Error Pages and Error Logging. Поскольку вы также используете ELMAH, вы должны знать о конфликте между настройкой пользовательских страниц ошибок и ELMAH, поскольку пользовательская страница ошибки «проглатывает» неиспользуемые исключения. К счастью, есть способ исправить это. Отъезд ELMAH and custom errors (сообщение, которое я написал).