Короче говоря:
Нет способа отловить ошибки оракула для пользовательской обработки, о которой я знаю.Тем не менее, я не думаю, что вы все равно должны пытаться это сделать.
Длинная версия:
Однако ваши причины хороши ...
Мне действительно нравится держать логику как можно ближе к данным
Логика должна быть как можно ближе к данным, это правда;однако это не подходит - это не логика, это представление кодов, которые идентифицируют исключения для уже определенной логики , и представление не должно смешиваться с уровнями данных или логики (доменсообщений об ошибках распространяется на все части системы: от клиентской стороны до серверной, также подумайте о переводе, согласованных обновлениях, упрощенном управлении и обзоре сообщений и т. д ...)
Для завершенияСообщение пользователя Raise_Application_Error неотличимо от сообщения приложения
True, но обратное также верно и, следовательно, не особенно актуально - если у вас есть центральный репозиторий кодов ошибок БД, кодов ошибок приложения и обработка ошибок будетобработайте это тогда, это не имеет значения (для конечного пользователя), какой уровень представляет сообщения об ошибках.Кроме того, в долгосрочной перспективе, не ясно, что это спасет вас от любой работы.
Разработчики увидят приятное сообщение, даже если доступ к данным в обход приложения
Это правдадля разработчиков, обращающихся к БД напрямую, будут более приятные сообщения об ошибках.Еще несколько комментариев здесь применимы - в сложных системах обход уровня приложения запрещен (даже для разработчиков);если это будет разрешено, вы ожидаете, что разработчики будут знать, где искать сообщения об ошибках из имен ограничений (центральный репозиторий кодов ошибок и сообщений должен / будет поддерживаться в одном и том же БД)
Перемещениеограничения на триггеры - это некрасиво (правда?), поэтому я должен найти что-то отличное от Raise_Application_Error
Уродливо в том смысле, что это представление и не должно быть в DDL.Кроме того, он несет неоправданные (?) Потери производительности, если они выполняются с помощью триггеров (не уверен, насколько он велик или изящен).
Примечание. В целом я согласен, что было бы неплохо иметь возможность подключиться к обработке ошибок СУБД.
Однако обработка ошибок и обработка сообщений об ошибках имеют следующие свойства
- должен быть поддерживаемым (теоретически это можно было бы сделать чисто путем хранения пользовательских сообщений об ошибках в информационной схеме, но стандарт SQL не указывает, что это чисто теоретический комментарий - на практике вам придетсядля этих целей есть собственные таблицы)
и, что еще более важно
- обработка сообщений об ошибках зависит от контекста (и обработчик ошибок будет наиболееинформирован с точки зрения клиента данных - иногда один и тот же код ошибки может потребовать другого представления, другого сообщения)