C# 在3层应用程序上捕获最佳实践的异常

C# 在3层应用程序上捕获最佳实践的异常,c#,exception,C#,Exception,我的WCF有以下3层: 服务 BLL DLL 有人能在以下方面帮助我吗 在以下场景中,上面哪一层是捕获和记录异常的最佳位置: 情景1: DLL上发生异常 情景:2: BLL上发生异常 另外,我是否应该总是在Try-and-Catch上包装服务对BLL的调用?这取决于您的系统,但我可能会将异常记录在BLL中。注意你的“日志”不被抓住!也就是说,在抓捕结束时,将出现一次重新抓捕 我根本没有捕捉到服务中的任何内容—这只是为了与客户机通信—不需要在其中添加任何逻辑 当然:捕捉您期望的异常,在抛出异常的地

我的WCF有以下3层:

  • 服务
  • BLL
  • DLL
  • 有人能在以下方面帮助我吗

    在以下场景中,上面哪一层是捕获和记录异常的最佳位置:

    情景1:

    DLL上发生异常

    情景:2:

    BLL上发生异常


    另外,我是否应该总是在Try-and-Catch上包装服务对BLL的调用?

    这取决于您的系统,但我可能会将异常记录在BLL中。注意你的“日志”不被抓住!也就是说,在抓捕结束时,将出现一次重新抓捕

    我根本没有捕捉到服务中的任何内容—这只是为了与客户机通信—不需要在其中添加任何逻辑

    当然:捕捉您期望的异常,在抛出异常的地方,只需让未经接受的异常传递

    例如: 场景1-可能捕获SQLException,尝试处理它们,如果没有,则将它们包装在一些DAL异常中并抛出这些异常。 场景2-可能从第3层捕获DAL异常,看看是否可以处理这些异常或再次包装它们


    我想,处理、记录和屏蔽各种未执行的异常几乎从来都不是一个好主意(
    catch(Exception)
    )-此后,应用程序状态将非常未定义。

    通读MSDN上有关

    无论您是否使用异常处理块,它都会经历许多场景,并为您提供一些关于异常处理策略最佳实践的好主意,如下图所示


    谢谢@Carsten König。WRAP、LOG和HANDLE之间的区别是什么?WRAP:将许多不同的异常放入一个单独的异常中(作为内部异常或替换它们)-优点:调用BL的函数不需要知道DAL可能抛出的所有异常,只需要知道wrapper异常日志:只需记录异常并重试/处理:捕获异常并进行一些定义良好的清理-不要重试或抛出新异常-我希望这个helpsHi@Carsten您能够澄清您的陈述“处理、记录和禁用各种未执行的异常(catch(exception))几乎从来都不是一个好主意”“当然-你经常会看到像
    catch(Exception){}
    catch(Exception){/*记录它*/}
    这样的事情,在这些情况下,每个异常都会被捕获,程序仍然会继续运行。”。但是如果你不这么认为,程序处于未知状态-你不知道发生了什么,你也不知道你的数据是否一切正常-所以最好通知用户,让程序死掉-也就是说,不捕捉异常或重新引用它。