.net 如何正确处理n层应用程序中的错误?
从第一天起,我就一直在努力解决这个问题。我周围有很多甚至根本不处理错误的代码,这可能对我没有帮助 无论如何,我正在使用传统的n层设计中的WebForms:UI->BLL->DAL。通常我所做的(我知道这是不对的)是尝试/捕获我的数据操作。如果有一个例外,我只是简单地抛出泡沫.net 如何正确处理n层应用程序中的错误?,.net,asp.net,error-handling,webforms,.net,Asp.net,Error Handling,Webforms,从第一天起,我就一直在努力解决这个问题。我周围有很多甚至根本不处理错误的代码,这可能对我没有帮助 无论如何,我正在使用传统的n层设计中的WebForms:UI->BLL->DAL。通常我所做的(我知道这是不对的)是尝试/捕获我的数据操作。如果有一个例外,我只是简单地抛出泡沫 try 'db operations catch ex as exception throw finally 'close connections end 因此,它会出现在BLL中,在那里有另一个try/catch,我将记
try
'db operations
catch ex as exception
throw
finally
'close connections
end
因此,它会出现在BLL中,在那里有另一个try/catch,我将记录错误。现在我想提醒用户出了什么问题,所以我再次抛出它,这样它就会冒泡到UI上。在UI级别,我将使用try/catch包装,如果出现错误,我将向他们显示友好消息
你的想法是什么?在这里我能做得更好吗?据我所知,您有三个try/Catch-每层一个:DAL、BLL和UI 你应该只在你打算做点什么的时候才接球 据我所知,你只是简单地从达尔追溯,所以没有必要 从BLL中记录exeption,这是一个很好的实践,因为您将能够收集有关异常的数据,以最终改进应用程序 然后在UI层捕获异常,将其转换为用户友好的内容。没关系 因此,我只会从DAL层中删除try/catch——如果您真的只需要追溯异常就可以了 在某些情况下,可以在BLL处添加一个标识符,该标识符将传递给UI异常并显示给最终用户,以便在他们调用支持时,支持人员可以将给定Id与服务器日志上的异常关联起来
可以这样做,例如,添加一个Guid或其他对Exception.Data collection有意义且唯一的东西。您需要在UI中抛出异常和捕获,如。。。在BLL中
try
{
//your code
}
catch (System.Data.SqlClient.SqlException ex)
{
if (ex.Number == 547)
{
throw new Exception("ActiveRecord");
}
}
finally
{
MasterConnection.Close();
}
在UI中链接执行选项并显示用户友好的消息
if (e.Exception != null)
{
if (e.Exception.InnerException.Message == "ActiveRecord")
{
//Show here User freind message
}
}
与其他答案不同,我将建议您也从UI中删除try/catch。您的BLL应该捕获异常,记录它,然后为UI提供一些机制来查询发生了什么错误 这将导致更干净的UI代码,因为您不必枚举业务层可能抛出的所有异常。您可以将UI代码简化为:
if (businessObject.doSomeOperation == true) {
// Do whatever you need to here.
} else {
// output error message from businessobject
// something like businessObject.LastErrorMessage();
}
但是如果DAL中发生错误,我不必关闭连接以防止泄漏吗?如果使用“using”语句,则无需显式地尝试/捕获DAL。在封面下,“Using”将用try/finally包装您的连接/命令,并在finally中关闭它们。