以下是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;
}
}
}
答案 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(我写的帖子)。