【发布时间】:2009-03-23 14:02:54
【问题描述】:
在我目前的项目中,我看到很多这种类型的代码:
public User GetUserByName(string userName)
{
try
{
// Lots of code here to check if the user is in the cache,
// get it from the DB if not, set properties on it, etc...
}
catch (Exception ex)
{
throw new Exception("Exception getting user by name, username: " + userName, ex);
}
}
我很欣赏这里的意图,使用局部变量对于调试确实很有用,但是在 every 方法周围放置一个 try/catch 似乎工作量太大,而且确实无济于事可读性。现在我忽略了我们正在抛出 System.Exception 的事实,自然更具体的类型会更好,但这不是我问题的重点。不用说,这可能会被大量复制和粘贴,而对异常消息没有任何修改...
所以我的问题是:如何捕获这种上下文信息(例如上面示例中的用户名)以进行调试?出于问题的目的,我们假设该方法编写得很好,并且任何特定异常检查都得到了处理,我想要的只是为任何无法处理的异常添加上下文在这里,需要冒泡到顶级处理程序。
我的第一个想法:
依靠日志记录框架来跟踪每个方法调用及其参数,这又是真正的样板文件,而且日志记录远远超过生产环境。
引入一些 AOP 并拦截每个方法(或有限的子集),在返回时检查异常并记录参数或将它们添加到抛出的异常中。
欢迎提出其他意见!
【问题讨论】: