2011-10-19 30 views
2

我有一个关于异常处理的问题。 我想这可能对你来说很容易,但对我来说,我只是不知道如何处理多层项目中的异常。处理多层异常的最佳方式

让我们说在我的解决方案中,我有几个项目。我有(较低)DataAccess,BizComponent,WCF,代理和演示(上)。

我尝试在DataAccess中“尝试捕获”并将异常抛出到BizComponent和BizComponent中我再次尝试“尝试捕获”并记录错误并再次将异常抛出到WCF。

在WCF和代理层,我做同样的事情。在表示层,我显示自定义消息给最终用户。

我的老人告诉我,我只需要开始在WCF和上层做“尝试捕捉”。 而且我不需要在DataAccess和BizComponent中执行操作,因为它将被捕获到 WCF中。

我是否应该尝试捕获DataAccess中的异常,BizComponent和 会抛出异常,或者我应该只尝试捕获WCF并开始向上层发送 ?

哪一个更好?

如果你不清楚我的问题,请告诉我。 这是我的第一个多层项目,所以它让我感到困惑。 在此先感谢。

回答

2

作为一个经验法则,如果你打算对它们做些什么,只能处理(catch)异常。

例如,如果您想在“上层”中提供附加信息,可以捕获数据层中的数据库异常。

我个人使用的方法是在业务层捕获并记录异常,然后重新抛出相同的异常或包装异常,为堆栈中较高层提供更友好的信息。这提供了一致的记录过程,并且不需要应用程序中的锅炉板记录代码。

如果您在多个应用程序中重复使用代码并且需要不同的日志存储,可以使用依赖注入来处理。

+0

我在DataAccess的“try catch”中什么都没做,只是抓住并抛出异常到上层。如果我不向上层提供任何东西,是否需要? – kevin

+1

@kevin如果你没有做任何事情,那么它没有任何用途,所以省略它。如果您需要执行任何清理,请使用'try finally'而不是'try catch'。 – detaylor

+1

@kevin - 我不知道如何重新抛出你的异常,但是(假设你抛出了相同的异常),你应该使用'throw;'而不是'throw ex;',因为这样可以保持堆栈,引发初始异常 – detaylor