从第1天开始,我一直在努力解决这个问题。我可能已经被许多甚至根本没有处理错误的代码所包围。
无论如何,我正在使用传统的n层设计中的WebForms:UI-> BLL-> DAL。通常我所做的(我知道它不对)是尝试/捕获我的数据操作。如果有例外我只是把它扔到泡沫中。
try
'db operations
catch ex as exception
throw
finally
'close connections
end
然后它会冒泡到BLL并且还有另一个try / catch,我将记录错误。现在我想提醒用户有问题,所以我再次抛出它,这样它就会冒泡到用户界面。在UI级别,我将包装一个try / catch,如果有错误,我将向他们显示一条友好的消息。
你有什么想法?我能在这里做得更好吗?
答案 0 :(得分:5)
据我了解,您有三次尝试/捕获 - 每层一个:DAL,BLL,UI。
你应该只在你想要采取行动时抓住它。
根据我的理解,你只需从DAL退回,所以不需要它。
从BLL您可以记录该例程,这是一个很好的做法,因为您将能够收集有关异常的数据,从而最终改进应用程序。
然后,您将在UI层捕获以将异常转换为用户友好的内容。没关系。
所以我只会从DAL层中删除try / catch - 如果你真的不做任何事情而不是重新启动异常。
在某些情况下,在BLL上添加一个传递给UI异常并向最终用户显示的标识符是有用的,这样如果他们调用支持,支持人员就可以将给定的Id与异常相关联。服务器的日志。
可以这样做,例如,为Exception.Data集合添加Guid或其他有意义且独特的东西。
答案 1 :(得分:2)
与其他答案不同,我建议您从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();
}
答案 2 :(得分:1)
你需要抛出异常并捕获UI,比如......在BLL中
try
{
//your code
}
catch (System.Data.SqlClient.SqlException ex)
{
if (ex.Number == 547)
{
throw new Exception("ActiveRecord");
}
}
finally
{
MasterConnection.Close();
}
在UI中设置execption并显示用户友好的消息。
if (e.Exception != null)
{
if (e.Exception.InnerException.Message == "ActiveRecord")
{
//Show here User freind message
}
}