2009-09-30 79 views
6

自从第1天起,我一直在为此而苦恼。它可能并没有帮助我已经被很多代码所包围,甚至根本不处理错误。如何正确处理n层应用程序中的错误?

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

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

因此,然后它泡到BLL和在那里我会记录错误的另一个try/catch。现在我想提醒用户有什么不对,所以我再次抛出它,这样它就会冒泡到用户界面。在用户界面层面,我会在try/catch中换行,如果出现错误,我会向他们显示一条友好的消息。

你的想法是什么?我能在这里做些什么?

回答

5

据我所知,你有三个尝试/捕获 - 每一层的一个:DAL,BLL,UI。

只有当你要对此做些什么时,才应该抓住它。

从我所了解的情况来看,您只需从DAL进行回放即可,因此不需要它。

从BLL中记录了exeption,这是一个很好的做法,因为您将能够收集有关异常的数据以最终改进应用程序。

然后你抓住UI层将异常转化为用户友好的东西。没关系。

所以我只会摆脱从DAL层的try/catch - 如果你真的没有做任何事情比重新排除异常。

在某些情况下,在传递给UI异常的BLL中添加一个标识符并将其显示给最终用户可能很有用,因此如果他们调用支持,支持人员可以将给定的Id与异常关联服务器的日志。

可以这样做,例如,添加Guid或其他对Exception.Data集合有意义且唯一的东西。

+0

但是,如果在DAL中发生错误,没有我不得不关闭,以防止泄漏的连接? – Mike 2009-09-30 12:13:23

+0

只需将连接/命令对象放入使用{}块 – 2009-09-30 12:22:06

+0

如果您正在使用“使用”语句,则无需显式**尝试/捕获DAL。在封面下方,“使用”将会用try/finally封装你的连接/命令,并在最后关闭它们。 – 2009-09-30 12:36:12

1

你需要抛出异常和捕获的UI,就像......在BLL

try 
     { 
      //your code 
     } 
     catch (System.Data.SqlClient.SqlException ex) 
     { 
      if (ex.Number == 547) 
      { 
       throw new Exception("ActiveRecord"); 
      } 
     } 
     finally 
     { 
      MasterConnection.Close(); 
     } 

儿茶素的execption在用户界面和显示用户友好的消息。

if (e.Exception != null) 
    { 
     if (e.Exception.InnerException.Message == "ActiveRecord") 
     { 
      //Show here User freind message 
     } 
    } 
2

与其他答案不同,我会建议从您的用户界面中删除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(); 
} 
相关问题