#java #exception #logging
#Ява #исключение #регистрация
Вопрос:
Я начал добавлять slf4j, регистрируя пользовательское исключение в своем проекте. Я добавляю журналы в свой класс ServiceImplementation, где у меня есть методы CRUD, которые я реализую в своем классе DaoImplementation. Вопрос в следующем: если мои методы CRUD уже добавили журналы и пользовательские исключения в класс Dao, должны ли они иметь такие же журналы в другом классе? Пример:
public class SpringTeacherDao implements TeacherDao { private static Logger logger = LoggerFactory.getLogger(SpringTeacherDao.class); private JdbcTemplate jdbcTemplate; @Autowired public SpringTeacherDao(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } @Override public void create(Teacher teacher) { logger.debug("Add teacher status: in progress..."); if (teacher == null) { String error = "Add teacher status: Error, teacher is null."; logger.warn(error); throw new UniversityDaoException(error); } String sql = "INSERT INTO teacher VALUES(?,?,?)"; try { jdbcTemplate.update(sql, teacher.getID(), teacher.getName(), teacher.getSurname()); }catch (DuplicateKeyException e){ String duplicate = "Teacher id already exist"; logger.warn(duplicate); throw new UniversityDaoException(duplicate); } logger.info("Add teacher status: Teacher has been added"); }
public class TeacherServiceImpl implements TeacherService { private static Logger logger = LoggerFactory.getLogger(TeacherServiceImpl.class); private final TeacherDao teacherDao; private final LectureDao lectureDao; private final TeachersLectureDao teachersLectureDao; public TeacherServiceImpl(TeacherDao teacherDao, LectureDao lectureDao, TeachersLectureDao teachersLectureDao) { this.teacherDao = teacherDao; this.lectureDao = lectureDao; this.teachersLectureDao = teachersLectureDao; } @Override public void addTeacher(Teacher teacher) { teacherDao.create(teacher); }
Ответ №1:
Это не вопрос, связанный с java, а скорее вопрос о методах кодирования. Вы можете получить разные ответы от каждого человека, которого вы спрашиваете, поскольку это может быть связано со стандартами, установленными в сообществе/компании/личных предпочтениях и т.д., Поэтому: не ожидайте единого ответа.
Моя точка зрения на эту тему (просто регистрирую исключение на нескольких уровнях, я не говорю о распространении/повторном создании/обертывании исключения — это другая история) выглядит следующим образом:
Если у данного слоя есть что-то конкретное, что можно добавить в журнал: зарегистрируйте его. Например:
- Уровень DAO может регистрировать информацию, связанную с сбоем БД, для исключения
- Уровень обслуживания (вызывающий этот DAO) может иметь больший контекст, в котором выполняется эта операция (т. Е. Некоторый идентификатор пользователя или конкретные данные операции), которые могут быть зарегистрированы с исключением.
- Там может быть больше слоев, т. е. Следующим может быть какой-то контроллер, который может регистрировать, т. е. какой-то идентификатор запроса (для целей трассировки) или, возможно, запрашивать данные.
Конечно, это привело бы к тому, что исключение регистрировалось бы 3 раза, каждый из которых добавлял бы больше данных в журнал. Тем не менее, когда вы пишете класс DAO, у вас нет гарантии, зарегистрирует ли служба исключение или нет, поэтому она всегда должна регистрировать его (если у вас нет глобального обработчика исключений, который регистрировал бы все неучтенные исключения — но тогда: у вас нет гарантии, что служба просто не поймала исключение без регистрации)
Кстати, правило для переосмысления исключения: Всегда вставляйте cause
исключение в новое исключение, которое вы создадите, таким образом вы увидите полную цепочку исключений.