我有一个三层结构
1.表示层
2.业务层
3.数据层
表示层通过服务外观与业务层交互。现在我很困惑应该在哪里抛出异常,应该在哪里记录它们以及应该在哪里捕获并吞下它们。目前,我在记录后在表示层中吞下了异常,而我正在记录并将它们扔到其他地方。这会导致异常被记录三次。这不是一个大问题,但我想知道这方面的最佳实践。
例如: 表示层代码:
try
{
UserService.GetAllUsers() ;
}
catch(Exception ex )
{
Logger.log(ex) // exception gets logged here
// redirect to a friendly user error page
}
用户服务层代码
try
{
IUserDAO userDAO = ServiceRegistry.GetRegistry().GetDAOFactory().GetUserDAO() ;
return userDao.GetAllUsers() ;
}
catch ( Exception ex)
{
Logger.log(ex) ; // and here !
throw;
}
DAOL层代码
try
{
// All db interaction code
}
catch(Exception ex)
{
Logger.log(ex) //and here !!
throw ;
}
最佳答案
绝对没有必要将每段代码都放在 try-catch block 中。例如,如果您的“DAOLayer”中发生异常,您的日志文件将包含相同的异常 3 次...
牢记异常(exception)的黄金法则 - 异常(exception)应该是异常(exception)!这通常意味着您应该只捕获您能够处理的异常 - 您应该忽略的所有其他异常 - 更高级别的处理程序应该处理这些异常。
如果您担心未处理的异常会使您的应用程序崩溃(这是理所当然的),您应该查看 .Net 为处理未处理的异常而公开的 2 个事件。第一个是 AppDomain.CurrentDomain.UnhandledException,第二个是 Application.ThreadException(位于 Windows.Forms 命名空间中)。
关于.net - 何时抛出异常以及何时记录异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1886355/