== Why is this an issue? Centralizing the definitions of custom exceptions comes with two major benefits: * The duplication of the exceptions declarations and ``++PRAGMA EXCEPTION_INIT++`` is avoided * The risk of associating multiple different exceptions to the same number is reduced === Noncompliant code example [source,sql] ---- SET SERVEROUTPUT ON DECLARE user_not_found EXCEPTION; PRAGMA EXCEPTION_INIT(user_not_found, -20000); -- Noncompliant, user_not_found is bound to -20000 BEGIN NULL; END; / DECLARE user_not_found EXCEPTION; PRAGMA EXCEPTION_INIT(user_not_found, -20000); -- Noncompliant, user_not_found is again bound to -20000, duplication BEGIN NULL; END; / DECLARE wrong_password EXCEPTION; PRAGMA EXCEPTION_INIT(wrong_password, -20000); -- Noncompliant, wrong_password is bound to -20000, conflicting with user_not_found BEGIN NULL; END; / ---- === Compliant solution [source,sql] ---- SET SERVEROUTPUT ON CREATE PACKAGE exceptions AS user_not_found EXCEPTION; wrong_password EXCEPTION; PRAGMA EXCEPTION_INIT(user_not_found, -20000); -- Non-Compliant (flag as false-positive) PRAGMA EXCEPTION_INIT(wrong_password, -20001); -- Non-Compliant (flag as false-positive), conflicts are easier to avoid END; / DROP PACKAGE exceptions; ---- ifdef::env-github,rspecator-view[] ''' == Implementation Specification (visible only on this page) === Message Move this exception declaration to a specialized package. endif::env-github,rspecator-view[]