将错误写入日志的最佳位置是哪里?(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");
}
第二个更好:
- 为什么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++中这是不可能的。