Я добавил уникальное ограничение на столбец в моей таблице.Когда ограничение нарушается, оно генерирует исключение, которое я не могу отловить и передать пользователю.
Exposed: Transaction attempt #0 failed: java.sql.BatchUpdateException: Batch entry 0 INSERT INTO templates (created_at, is_deleted, name, sections) VALUES ('2018-10-03 16:31:25.732+05:30', 'FALSE', 'Template1', '[{"title":"Introduction"}]')
RETURNING * was aborted: ERROR: duplicate key value violates unique constraint "templates_name_key"
Detail: Key (name)=(Template1) already exists. Call getNextException to see other errors in the batch.. Statement(s): INSERT INTO templates (created_at, is_deleted, name, sections) VALUES (?, ?, ?, ?)
! org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "templates_name_key"
! Detail: Key (name)=(Template1) already exists.
- Как перехватить такого рода исключения SQL с пользователемчитаемое сообщение?
- Существуют ли передовые практики для отлова этих исключений?
- Должны ли мы отлавливать их внутри транзакции или снаружи?Есть ли необходимость в этом?
Ниже приведен фрагмент, который я пробовал.
return try {
val template: TemplateSerializer = transaction {
val newTemplate = Template.insert(request)
TemplateSerializer.serialize(newTemplate)
}
Response.status(201).entity(template).build()
} catch (e: Exception) {
if(e is SQLIntegrityConstraintViolationException) {
resourceLogger.error("SQL constraint violated")
} else if(e is BatchUpdateException) {
resourceLogger.error("SQL constraint violated")
} else
resourceLogger.error(e.message)
Response.status(422).entity(mapOf("error" to true, "message" to "Insertion failed")).build()
}
Сообщение SQL constraint violated
вообще не печатается.Пробовал множественный улов с разными классами исключений.Ничего не получалось.
Отправка такого общего сообщения об ошибке не помогает.