.net - 何时抛出异常以及何时记录异常?

标签 .net exception

我有一个三层结构
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/

相关文章:

c# - 处理通过 TrayIcon 的 ShowBalloonTip() 显示的气球提示的点击

c# - Telerik RadWindow 和 Response.Redirect - JavaScript 错误

.net - 我应该将 OODB 用于小型应用程序吗?

没有堆栈溢出的 Java 正则表达式解析器

java - 使用异步 TaskManager 处理作业/步骤异常

java - 如果两个异常都有不同的条件,那么在一个方法中抛出两次是否违反良好实践?

与整数参数一起使用时,Java Color 创建会抛出 IllegalArgumentException

c# - 如何测试与数据库的连接是否成功建立?

c# - 在 ListView 列中添加图像

java - catch block 中的 throw 语句如何防止未初始化变量的编译器错误?