这是一个巨大的话题,有很多不必要的争议(声音很大的人会提供不好的信息!)如果你愿意处理这个问题,请听从 s1mm0t 的建议,这基本上是可以接受的。
但是,如果您想要一个单词的答案,请将它们放在 PL 中。严肃的。如果您可以摆脱它,请将您的错误处理放在全局异常处理程序中(出于安全原因,所有错误都应记录并提供代码以在生产中查找日志(尤其是 Web 时),但在开发过程中提供完整的详细信息速度原因)。
编辑:(澄清) 你必须在任何地方处理一些错误——但这不是“每个功能”的规范。大多数时候,让他们冒泡到 PL 并使用您自己的代码处理 .NET 的全局错误:通过一个通用例程从那里记录完整的调用堆栈,该例程可通过事件处理程序从所有 3 层访问(请参阅消息底部的编辑)。这意味着您不会在所有代码中都使用 try/catch;只是您期望和错误的部分,并且可以在那里处理它,或者,非关键部分,您使用它们记录错误并通知用户不可用的功能(这更罕见,对于超级可靠/关键程序)
除此之外,在处理资源有限的项目时,我经常使用 'using' 关键字或 try/finally/end try 而没有捕获。用于多线程锁/互斥/重新进入预防标志/等。您还需要在所有情况下都尝试/最终,这样您的程序仍然可以工作(尤其是有状态的应用程序)。
如果您不正确地使用异常(例如,当您应该使用 IF 语句或检查它时处理非错误,那么在您尝试之前,一个不确定的操作将起作用),这种理念将更加崩溃。
附带说明,在胖客户端应用程序中,尤其是在可能丢失大量数据或用户输入的情况下,在尝试保存数据的地方使用更多尝试/捕获可能会更好(当然标记为尚未生效) )。
编辑:另一个需要至少在 PL 中有记录例程- 这将根据平台而有所不同。我们正在开发的一个应用程序与 3 个 PL 版本共享 BLL/DAL:一个 ASP.Net 版本、一个 winforms 版本和一个控制台应用程序批处理模式回归测试版本。调用的日志记录例程实际上在 BLL 中(DAL 只抛出错误或完全处理它获得或重新抛出的任何错误)。然而,这引发了一个由 PL 处理的事件;在 Web 上,它将它放在服务器的日志中,并进行 Web 样式的错误消息显示(对生产友好的消息);在 WinForms 中会出现一个带有技术支持信息等的特殊消息窗口,并在后台记录错误(开发人员可以做一些“秘密”来查看完整信息)。当然,在测试版本中,这是一个更简单的过程,但也有所不同。
不知道除了传递参数“什么平台”之外,我会如何在 BLL 中做到这一点,但由于它不包括日志记录所依赖的 winforms 或 asp 库,所以这仍然是一个技巧。