通过elmah处理异常

时间:2016-07-13 17:09:26

标签: c# asp.net-mvc elmah

以下是UI,BLL和DAL中的代码。如果DAL的executiontenonquery中存在任何问题,BLL需要处理异常 并向用户显示通用消息。我们正在使用Elmah进行错误处理。可以请任何人建议如何处理异常并向用户显示通用消息页面(如错误500)。

控制器

refNo = _formServiceWorker.SubmitFormData(formData, isFinalized);

业务逻辑层:

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

数据访问层

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

2 个答案:

答案 0 :(得分:0)

您需要使用try-catch块在数据访问层中包装完整代码(或者只是需要的sqlcmd.ExecuteNonQuery()行)并抛出自定义异常(例如:自定义DataAccessLayerException异常类) 。然后在您的Controller代码中,您将添加一个try-catch块,处理从数据访问层抛出的自定义异常,并向用户显示一般消息页面(如错误500)。

答案 1 :(得分:0)

您可能已经解决了这个问题,但为了将来参考,我认为这是解决此问题的更好方法。您确实可以在try catch中包装数据访问层代码,并将原始异常作为内部异常抛出自定义异常。您也可以让异常流入Web框架并让它处理它。

你不应该做的(imo)是处理你所有网站代码中的db错误,并做一些自定义的事情,比如重定向到错误页面或simiar。这是自定义错误页面的用途。这是一个非常复杂的主题,但有一些很好的文档来设置它。我发现的最好的是Demystifying ASP.NET MVC 5 Error Pages and Error Logging。由于您也在使用ELMAH,因此您应该注意设置自定义错误页面与ELMAH之间存在冲突,因为自定义错误页面会吞下"未被捕获的例外。幸运的是,有一种方法可以解决这个问题。查看ELMAH and custom errors(我写的帖子)。