An error raised by the business layer is shown to the user as a message in the language of the user. Two kinds of error reach the user this way. ## Business Rule Errors An [[Invantive Studio/Repository/Concepts/Attribute Rule|attribute rule]] or a [[Invantive Studio/Repository/Concepts/Hook Package|hook package]] that rejects a change raises a message written as a [[Invantive Studio/Repository/Concepts/Resource Code|resource code]]. The message is translated in the database before it is passed on, with its parameters filled in, and the product shows it as a validation message rather than as a technical error. The code of the rule identifies which rule rejected the change. ## Database Errors An error of the database itself, such as a duplicate value in a unique index, a reference to a row that does not exist or a missing value in a mandatory column, is translated into a message that names the business object and its columns with their labels. A duplicate natural key of an application language, for instance, reads: > There is already a Application Language with the combination of Application ID and Language ID '...'. The natural key of the row is filled in at the end, so the user can see which row clashed. ## The Technical Detail Below the message the product keeps the technical detail of the error, such as the call stack in the database. It is meant for support and is shown on request. ## Handing an Error Over The error window offers "Copy as JSON" and "Save as JSON". Both make one document of the message code, the message, the technical detail and the statement which caused the error, with personal data masked on a best-effort basis, to paste into an AI or to send to support. The document is described in [[Invantive Query Tool/Error as JSON|Error as JSON]]; available from release 28.0.