将错误写入日志的最佳位置是哪里?(BLL或ExceptionConstructor)

本文关键字:BLL ExceptionConstructor 错误 日志 最佳位置 | 更新日期: 2023-09-27 18:09:32

我想抛出一些自定义异常并将其写入日志。
关于写日志的正确位置的最佳实践是什么:BLL还是异常构造函数本身?

class TaskDataValidationFailedException : Exception
{
    public TaskDataValidationFailedException(TaskValidationResult validation)
    {
        this.validation = validation;
        //SHOULD I WRITE THE LOG HERE? 
        _log.Info("Task " + task.Name + " valication failed");
    }
}

或吗?

if (!validation.validationSucceeded)
{
     throw new TaskDataValidationFailedException(validation);
     //OR SHOULD I WRITE THE LOG HERE? 
     _log.Info("Task " + task.Name + " valication failed");
}

将错误写入日志的最佳位置是哪里?(BLL或ExceptionConstructor)

第二个更好:

  • 为什么exception应该知道log?这两件事是独立的。
  • 你可以写任何数量的变量,在第一种情况下,你必须传递所有的变量到你的异常。

你也可以考虑写一个函数来检查验证,写日志和抛出异常:

 void CheckValidation(...) {
     if (!validation.validationSucceeded) {
         _log.Info("Task " + task.Name + " valication failed");
         throw new TaskDataValidationFailedException(validation);
      }
 }

大多数人都会在抛出异常之前记录异常。然而,在Exception的构造函数中这样做有它的优点,如果你做得对的话做得好意味着你需要多一个继承级别。因此,您可以在一个集中的构造函数中完成它(无论如何,系统的每个"组件"都应该有一个Exception基类)。中间级别的Exception将有一个接受消息并对其进行记录的actor。在Java中,中间Exception可能会调用一个可以在派生类中被覆盖的方法,但在c++中这是不可能的。