我目前正在重构具有多层体系结构的大型子系统,并且正在努力设计一种有效的错误记录\处理策略。
假设我的架构包含以下三层:
- 公共接口(即MVC控制器)
- 域层
- 资料存取层
我的困惑源是我应该在哪里实施错误日志记录\处理:
最简单的解决方案是在顶层(即Public Interface \ MVC Controller)实现日志记录。但是,这感觉不对,因为这意味着将异常遍历不同的层,然后将其记录下来。而不是将异常记录在源头。
从源头记录异常显然是最好的解决方案,因为我掌握了最多的信息。我的问题是,如果不捕获所有异常,就无法在源头捕获每个异常,并且在域/公共接口层中,这将导致捕获已被下面的层捕获,记录和重新抛出的异常。
另一种可能的策略是#1和#2的混合使用。因此,我在最有可能引发异常的层上捕获了特定异常(例如,
SqlExceptions
在数据访问层中捕获,记录和重新抛出异常),然后在顶层记录了任何其他未捕获的异常。但是,这还需要我在顶层捕获并重新记录每个异常,因为我无法区分已记录\处理过的错误与未记录过的错误。
现在,显然这是大多数软件应用程序中的问题,因此必须有一个解决该问题的标准解决方案,以使异常在源头被捕获并记录一次。但是我自己却看不到该怎么做。
请注意,该问题的标题与“ 在多层应用程序中记录异常 ”非常相似,但是该帖子中的答案不够详细,不足以回答我的问题。
The easiest solution would be to implement the logging at the top level
- 做这个。从源头记录异常并不是一个好主意,我遇到的每个执行此操作的应用程序都是要调试的PITA。处理异常应由调用者负责。
try{ ... } catch(Exception ex) { Log(ex); }
在每一层中,将导致在每一层记录相同的异常。(在代码库的每一层捕获每个异常似乎也很糟糕。)