Обработчик ошибок и регистратор - это два разных объекта. Обработчик ошибок решает, что делать с ошибками. Должны ли они быть немедленно отправлены в логгер, сохранены ли они в базах данных или просто сохранены в каком-то буфере, пока кто-нибудь не спросит.
Регистратор решает, как зарегистрировать данное сообщение. Должен ли он отображаться на консоли или сохраняться в файле на диске, в каком формате он должен отображаться.
Имейте в виду особенности регистратора.
1) Это должен быть независимый класс. Его поведение не должно зависеть от других классов.
2) Логгер наиболее предпочтительным должен быть синглтоном. Вам не нужно много объектов, плавающих вокруг, чтобы сделать то же самое. Но тогда у синглтон-классов есть свои головные боли, когда дело доходит до многопоточности. Так что я знаю, что это спорный вопрос.
3) Он должен и должен иметь возможности асинхронного ведения журнала. Это означает реализацию производителя и потребителя. (Ведение журнала является операцией ввода-вывода и, следовательно, дорогостоящей по своей природе. Вы не хотите, чтобы ваша основная обработка зависала от этого. Но, опять же, вы, возможно, не захотите использовать потоки для удаления этой операции.)
В вашей реализации регистратора ошибок я не вижу ни одного регистратора. Также ваш обработчик ошибок сохраняет одну ошибку. Вам может понадобиться вектор ошибок. Держите SetError с фиксированными аргументами. Передайте аргументы, такие как идентификатор ошибки, сообщение об ошибке и длина буфера ошибок. Пусть звонящий создаст сообщение об ошибке.