如何正确处理n层应用程序中的错误?

时间:2009-09-30 11:56:26

标签: .net asp.net error-handling webforms

从第1天开始,我一直在努力解决这个问题。我可能已经被许多甚至根本没有处理错误的代码所包围。

无论如何,我正在使用传统的n层设计中的WebForms:UI-> BLL-> DAL。通常我所做的(我知道它不对)是尝试/捕获我的数据操作。如果有例外我只是把它扔到泡沫中。

try
'db operations
catch ex as exception
throw
finally
'close connections
end

然后它会冒泡到BLL并且还有另一个try / catch,我将记录错误。现在我想提醒用户有问题,所以我再次抛出它,这样它就会冒泡到用户界面。在UI级别,我将包装一个try / catch,如果有错误,我将向他们显示一条友好的消息。

你有什么想法?我能在这里做得更好吗?

3 个答案:

答案 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
        }
    }