2016-07-13 10 views
-1

Das Folgende ist der Code in UI, BLL und DAL. BLL muss die Ausnahme behandeln, wenn in der Executon-Abfrage von DAL ein Problem auftritt, und den Benutzer mit einer allgemeinen Nachricht anzeigen. Wir verwenden Elmah für die Fehlerbehandlung. Könnte jemand bitte vorschlagen, wie man die Ausnahme behandelt und eine allgemeine Nachrichtenseite (wie Fehler 500) dem Benutzer zeigt.Ausnahmebehandlung durch Elmah

-Controller

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; 
     } 
    } 
} 

Antwort

0

Sie müssen den vollständigen Code (oder nur die sqlcmd.ExecuteNonQuery() wickeln Zeile wie Sie benötigen) in der Datenzugriffsschicht mit einem try-catch-Block und werfen Sie eine benutzerdefinierte Ausnahme (zB: benutzerdefinierte DataAccessLayerException-Ausnahmeklasse). Dann würden Sie in Ihrem Controller-Code einen try-catch-Block hinzufügen, die benutzerdefinierte Ausnahme behandeln, die von der Datenzugriffsschicht ausgelöst wird, und dem Benutzer eine generische Meldungsseite (z. B. Fehler 500) anzeigen.

0

Sie haben das wahrscheinlich schon gelöst, aber für zukünftige Referenz denke ich, es gibt eine bessere Lösung für dieses Problem. Sie können Ihren Datenzugriffsschicht-Code tatsächlich in try catch einschließen und eine benutzerdefinierte Ausnahme mit der ursprünglichen Ausnahme als innere Ausnahme auslösen. Sie können die Exception auch durch das Webframework laufen lassen und sich von diesem behandeln lassen.

Was Sie nicht tun sollten (imo), ist Db-Fehler in Ihrem gesamten Website-Code zu behandeln und tun etwas Brauch wie Umleiten auf eine Fehlerseite oder ähnliches. Dafür gibt es benutzerdefinierte Fehlerseiten. Es ist ein sehr komplexes Thema, aber es gibt einige gute Dokumentation, um es einzurichten. Der beste, den ich gefunden habe, ist Demystifying ASP.NET MVC 5 Error Pages and Error Logging. Da Sie auch ELMAH verwenden, sollten Sie einen Konflikt zwischen dem Einrichten von benutzerdefinierten Fehlerseiten und ELMAH kennen, da die benutzerdefinierte Fehlerseite die nicht abgefangenen Ausnahmen "verschluckt". Zum Glück gibt es eine Möglichkeit, das zu beheben. Check out ELMAH and custom errors (ein Beitrag, den ich geschrieben habe).