{
    "componentChunkName": "component---src-templates-doc-tsx",
    "path": "/docs/3.9.x/en/development/error-handling/",
    "result": {"data":{"navigation":{"nodes":[{"section":"Getting started","entries":[{"frontmatter":{"title":"Installation","subtitle":"Installation of scm-manager","partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/installation/"}},{"frontmatter":{"title":"First Startup","subtitle":"Administration User Creation","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/first-startup/"}},{"frontmatter":{"title":"Migrate from v1 to v3","subtitle":"How to use the Migration-Wizard","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/migrate-scm-manager-from-v1/"}},{"frontmatter":{"title":"Migrate from v2 to v3","subtitle":"Changes in the configuration","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/migrate-scm-manager-from-v2/"}},{"frontmatter":{"title":"Import existing repositories","subtitle":"How to import existing repositories into SCM-Manager","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/import/"}},{"frontmatter":{"title":"Frequently Asked Questions","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/faq/"}},{"frontmatter":{"title":"Known Issues","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/known-issues/"}}]},{"section":"User-oriented","entries":[{"frontmatter":{"title":"Repository","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/repo/"}},{"frontmatter":{"title":"User","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/user/"}},{"frontmatter":{"title":"Groups","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/group/"}},{"frontmatter":{"title":"Administration","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/admin/"}},{"frontmatter":{"title":"Profile","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/profile/"}},{"frontmatter":{"title":"Notifications","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/notification/"}},{"frontmatter":{"title":"CLI Client","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/cli/"}},{"frontmatter":{"title":"Shortcuts","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/user/shortcuts/"}}]},{"section":"Administration","entries":[{"frontmatter":{"title":"Base Directory","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/administration/basedirectory/"}},{"frontmatter":{"title":"Logging","subtitle":"Configuration and locations of SCM-Manager logging","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/administration/logging/"}},{"frontmatter":{"title":"SCM-Server Configuration","subtitle":"Various configuration options for the SCM-Server","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/administration/scm-server/"}},{"frontmatter":{"title":"Reverse Proxy","subtitle":"How to use SCM-Manager with common reverse proxies","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/administration/reverse-proxies/"}},{"frontmatter":{"title":"Caching for Working Directories","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/administration/workdir_caching/"}}]},{"section":"Development","entries":[{"frontmatter":{"title":"Intellij IDEA Configuration","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/intellij-idea-configuration/"}},{"frontmatter":{"title":"Building SCM-Manager from Source","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/build-from-source/"}},{"frontmatter":{"title":"Architecture overview","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/architecture-overview/"}},{"frontmatter":{"title":"Common pitfall occurred while developing the SCM V2","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/ui-common-pitfall/"}},{"frontmatter":{"title":"Permission Concept","subtitle":"Fine-grained permission for SCM-Manager v2","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/permission-concept/"}},{"frontmatter":{"title":"Decision Table","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/decision-table/"}},{"frontmatter":{"title":"Error Handling","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/error-handling/"}},{"frontmatter":{"title":"Styleguide","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/styleguide/"}},{"frontmatter":{"title":"Testing Guide","subtitle":"Howto write tests for SCM-Manager","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/testing-guide/"}},{"frontmatter":{"title":"Integration Tests","subtitle":"How to run integration tests","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/integration-tests/"}},{"frontmatter":{"title":"UI-Extensions","subtitle":"How to extend the SCM-Manager UI with plugins","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/ui-extensions/"}},{"frontmatter":{"title":"I18n","subtitle":"Howto do internationalization","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/i18n/"}},{"frontmatter":{"title":"Building Forms","subtitle":"Howto build forms for SCM-Manager","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/building-forms/"}},{"frontmatter":{"title":"Javadoc","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/javadoc/"}},{"frontmatter":{"title":"CLI Guidelines","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/cli-guideline/"}},{"frontmatter":{"title":"Definition of Done","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/definition-of-done/"}},{"frontmatter":{"title":"DOD for UI development","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/ui-dod/"}}]},{"section":"Plugin Development","entries":[{"frontmatter":{"title":"Create a plugin","subtitle":"Create a new SCM-Manager plugin","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/create/"}},{"frontmatter":{"title":"Migrate a v1 plugin","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/migrate-plugin-from-v1/"}},{"frontmatter":{"title":"Extension Points","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/extension-points/"}},{"frontmatter":{"title":"i18n for Plugins","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/i18n-for-plugins/"}},{"frontmatter":{"title":"Plugin Descriptor","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/plugin-descriptor/"}},{"frontmatter":{"title":"SCM-Manager v2 Plugin Development","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/plugin-development/"}},{"frontmatter":{"title":"Publish","subtitle":"Publish your Plugin","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/publish/"}}]}]},"versions":{"group":[{"fieldValue":"1.0.x"},{"fieldValue":"1.x"},{"fieldValue":"2.0.x"},{"fieldValue":"2.1.x"},{"fieldValue":"2.10.x"},{"fieldValue":"2.11.x"},{"fieldValue":"2.12.x"},{"fieldValue":"2.13.x"},{"fieldValue":"2.14.x"},{"fieldValue":"2.15.x"},{"fieldValue":"2.16.x"},{"fieldValue":"2.17.x"},{"fieldValue":"2.18.x"},{"fieldValue":"2.19.x"},{"fieldValue":"2.2.x"},{"fieldValue":"2.20.x"},{"fieldValue":"2.21.x"},{"fieldValue":"2.22.x"},{"fieldValue":"2.23.x"},{"fieldValue":"2.24.x"},{"fieldValue":"2.25.x"},{"fieldValue":"2.26.x"},{"fieldValue":"2.27.x"},{"fieldValue":"2.28.x"},{"fieldValue":"2.29.x"},{"fieldValue":"2.3.x"},{"fieldValue":"2.30.x"},{"fieldValue":"2.31.x"},{"fieldValue":"2.32.x"},{"fieldValue":"2.33.x"},{"fieldValue":"2.34.x"},{"fieldValue":"2.35.x"},{"fieldValue":"2.36.x"},{"fieldValue":"2.37.x"},{"fieldValue":"2.38.x"},{"fieldValue":"2.39.x"},{"fieldValue":"2.4.x"},{"fieldValue":"2.40.x"},{"fieldValue":"2.41.x"},{"fieldValue":"2.42.x"},{"fieldValue":"2.43.x"},{"fieldValue":"2.44.x"},{"fieldValue":"2.45.x"},{"fieldValue":"2.46.x"},{"fieldValue":"2.47.x"},{"fieldValue":"2.48.x"},{"fieldValue":"2.5.x"},{"fieldValue":"2.6.x"},{"fieldValue":"2.7.x"},{"fieldValue":"2.8.x"},{"fieldValue":"2.9.x"},{"fieldValue":"3.0.x"},{"fieldValue":"3.1.x"},{"fieldValue":"3.10.x"},{"fieldValue":"3.11.x"},{"fieldValue":"3.2.x"},{"fieldValue":"3.3.x"},{"fieldValue":"3.4.x"},{"fieldValue":"3.5.x"},{"fieldValue":"3.6.x"},{"fieldValue":"3.7.x"},{"fieldValue":"3.8.x"},{"fieldValue":"3.9.x"}]},"languages":{"group":[{"fieldValue":"de"},{"fieldValue":"en"}]},"markdownRemark":{"html":"<p>As a highly extensible product, SCM-Manager offers at least three ways to interact with:</p>\n<ul>\n<li>the GUI,</li>\n<li>the REST API, and</li>\n<li>the Java API</li>\n</ul>\n<p>Having these three layers, the error handling should be consistent among these. That is, as a developer I would not like\nto have custom made error codes in the REST layer that I cannot find in the Java API. Furthermore it is essential to get\nprecise error messages with hints how to find a way out (if possible), not only for a programmer making interactive\ncalls, but also for other programs. Last but not least it should be easy for plugin developers to adapt the error\nhandling.</p>\n<p>On the GUI layer, these information have to be translated into messages that can be easily handled.</p>\n<p>Here are some example error cases:</p>\n<p><em>Use case</em>: Read the metadata for a branch</p>\n<p><em>Possible errors:</em></p>\n<ul>\n<li>The repository is missing</li>\n<li>There is no such branch</li>\n<li>The user is not authorized to read the metadata</li>\n<li>The repository is corrupt on file system level</li>\n</ul>\n<hr>\n<p><em>Use case:</em> Create a new user</p>\n<p><em>Possible errors:</em></p>\n<ul>\n<li>Invalid characters in name</li>\n<li>Missing mandatory property</li>\n<li>Conflict with an existing user</li>\n<li>Insufficient priviliges</li>\n</ul>\n<hr>\n<p><em>Use case:</em> Update the e-mail of a repository</p>\n<p><em>Possible errors:</em></p>\n<ul>\n<li>The repository does not exist</li>\n<li>The repository was modified concurrently</li>\n<li>Invalid e-mail address</li>\n</ul>\n<h2 id=\"java-api\" style=\"position:relative;\"><a href=\"#java-api\" aria-label=\"java api permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Java API</h2>\n<p>In SCM-Manager we make heavy use of Java <code class=\"language-text\">Exception</code>s, not only for technical exceptions in the program flow like\nreading corrupt file systems, but also for \"user errors\" like illegal values or requests for missing data.</p>\n<p>These exceptions are handled by\nJEE <a href=\"https://docs.oracle.com/javaee/7/api/jakarta/ws/rs/ext/ExceptionMapper.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"language-text\">ExceptionMapper</code></a> s. Doing so, it is\npossible to concentrate on implementing the \"happy path\" without the need to explicitly handle error cases everywhere (\nfor example you do not have to check whether got <code class=\"language-text\">null</code> as a result). Nonetheless we still had to decide whether to use\nchecked or unchecked exceptions. We have chosen to use unchecked exceptions due to the following reasons:</p>\n<ul>\n<li>Checked exceptions would have had to be declared everywhere.</li>\n<li>A checked exception can somehow trigger a \"I have to handle this though I don't know how\" feeling that would be wrong,\nbecause we do have mappers for these exceptions.</li>\n</ul>\n<p>Therefore handling such an exception has to be a concious decision.</p>\n<p>In the following we will introduce the exceptions we are using:</p>\n<h3 id=\"used-exceptions\" style=\"position:relative;\"><a href=\"#used-exceptions\" aria-label=\"used exceptions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Used exceptions</h3>\n<h4 id=\"notfoundexception\" style=\"position:relative;\"><a href=\"#notfoundexception\" aria-label=\"notfoundexception permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">NotFoundException</code></h4>\n<p>A <code class=\"language-text\">NotFoundException</code> is thrown, whenever \"things\" where requested but were not found.</p>\n<h4 id=\"alreadyexistsexception\" style=\"position:relative;\"><a href=\"#alreadyexistsexception\" aria-label=\"alreadyexistsexception permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">AlreadyExistsException</code></h4>\n<p>This exception is thrown whenever an entity cannot be created, because another entity with the same key identifyer\nexists.</p>\n<h4 id=\"concurrentmodificationexception\" style=\"position:relative;\"><a href=\"#concurrentmodificationexception\" aria-label=\"concurrentmodificationexception permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">ConcurrentModificationException</code></h4>\n<p>When you try to modify an entity based on an outdated version, this exception is thrown. For entities like user, group\nor repository the \"last modified\" timestamp of <code class=\"language-text\">ModelObject</code> is used to check this.</p>\n<h4 id=\"nativerepositoryaccessexception\" style=\"position:relative;\"><a href=\"#nativerepositoryaccessexception\" aria-label=\"nativerepositoryaccessexception permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">NativeRepositoryAccessException</code></h4>\n<p>Failures while accessing native repositories (most of the time) result in <code class=\"language-text\">java.io.IOException</code>s. To distinguish these\nexceptions from other I/O errors like network exceptions and to make them unchecked, we wrap them\nin <code class=\"language-text\">NativeRepositoryAccessException</code>.</p>\n<h4 id=\"resteasyviolationexception\" style=\"position:relative;\"><a href=\"#resteasyviolationexception\" aria-label=\"resteasyviolationexception permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">ResteasyViolationException</code></h4>\n<p>Input validation is handled\nusing <a href=\"https://docs.jboss.org/resteasy/docs/3.0.0.Final/userguide/html/Validation.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">RESTEasy's validation support</a>.\nConstraint violations result in <code class=\"language-text\">ResteasyViolationException</code>s.</p>\n<h4 id=\"all-other-runtime-exceptions\" style=\"position:relative;\"><a href=\"#all-other-runtime-exceptions\" aria-label=\"all other runtime exceptions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>All other runtime exceptions</h4>\n<p>All other <code class=\"language-text\">java.lang.RuntimeException</code>s can be treated as unexpected errors, that either hint to severe problems (eg.\ndisk access failures) or implementation errors. It is unlikely that these can be handled by the program gracefully. They\nwill be caught by a generic exception handler which will wrap them in a new exception providing further SCM specific\ninformation.</p>\n<h4 id=\"checked-exceptions\" style=\"position:relative;\"><a href=\"#checked-exceptions\" aria-label=\"checked exceptions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Checked exceptions</h4>\n<p>Above we mentioned, that we want to use unchecked exceptions only. Therefore we have to wrap checked exceptions for\nexample created by libraries or frarmeworks to make them unchecked. Normally it is sufficiant to wrap them in a\nRuntimeException using a proper message, except you plan to handle them somewhere else than at resource level (then it\nwould be appropriate to introduce a new exception class extending <code class=\"language-text\">RuntimeException</code>).</p>\n<h3 id=\"enrichment-of-exceptions\" style=\"position:relative;\"><a href=\"#enrichment-of-exceptions\" aria-label=\"enrichment of exceptions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Enrichment of exceptions</h3>\n<h4 id=\"context\" style=\"position:relative;\"><a href=\"#context\" aria-label=\"context permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Context</h4>\n<p>Most of these exceptions must provide information about <em>what</em> could not have been found, updated, whatsoever. This is\nnecessary, because otherwise it may not be clear at what step of a potentionally complex process this exception occured.\nThough this sounds easy, it has some complexity because for example the access of a file in a repository can fail on\nmany levels (the file is missing in the given revision, the revision is missing, or the repository itself is missing).\nIn these cases you have to know the complete access path (what file in what revision of what changeset in what\nrepository).</p>\n<p>To ensure that this is done in a reproducable and consistent way, SCM-Manager will provide utility functions to creaate\nsuch exceptions.</p>\n<h4 id=\"transaction-ids\" style=\"position:relative;\"><a href=\"#transaction-ids\" aria-label=\"transaction ids permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Transaction IDs</h4>\n<p>To be able to retrace the cause for exceptions, it is helpful to link log messages to these exceptions. To do so,\nSCM-Manager introduces transaction ids that are generated for single requests or other related actions like the\nprocessing of hooks or cron jobs. This transaction id will be part of every log message and every API response.</p>\n<p>For http requests, this can be done using MDC filter.</p>\n<h4 id=\"identification-of-exceptions\" style=\"position:relative;\"><a href=\"#identification-of-exceptions\" aria-label=\"identification of exceptions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Identification of exceptions</h4>\n<p>To be able to identify different types of exceptions even outside of the java ecosystem, each SCM-Manager exception\nclass will get a unique type id that will be created using the <code class=\"language-text\">DefaultKeyGenerator</code> during development. We chose to\ngenerate these ids and not \"human readable\" ones to prevent collisions between plugins.</p>\n<h3 id=\"logging-of-exceptions\" style=\"position:relative;\"><a href=\"#logging-of-exceptions\" aria-label=\"logging of exceptions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Logging of exceptions</h3>\n<p>To be able to retrace errors a proper logging is indispensible. So we decided to use the following rules for logging\nexceptions:</p>\n<ul>\n<li>Native SCM manager exceptions will be logged at log level <code class=\"language-text\">INFO</code> with their message, only. The complete stacktrace\nwill be logged at log level <code class=\"language-text\">DEBUG</code>.</li>\n<li>All other exceptions will be logged on level <code class=\"language-text\">WARN</code> with the complete stacktrace, because they indicate something\ngoing wrong on a fundamental level.</li>\n</ul>\n<h2 id=\"rest-api\" style=\"position:relative;\"><a href=\"#rest-api\" aria-label=\"rest api permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>REST API</h2>\n<h3 id=\"status-codes\" style=\"position:relative;\"><a href=\"#status-codes\" aria-label=\"status codes permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Status codes</h3>\n<p>SCM-Manager uses <a href=\"https://en.wikipedia.org/wiki/List_of_HTTP_status_codes\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">http status codes</a> to identify types of\nerrors (and successes, that is) and doing so provides a first hint, what may have gone wrong:</p>\n<table>\n<thead>\n<tr>\n<th>Status code</th>\n<th>Principal error cause</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>200</td>\n<td>No error, everything is fine</td>\n</tr>\n<tr>\n<td>201</td>\n<td>The item has been created without an error</td>\n</tr>\n<tr>\n<td>204</td>\n<td>The request has been processed without an error</td>\n</tr>\n<tr>\n<td>400</td>\n<td>Something is not valid with the data provided</td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing authentication (not logged in?)</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Missing authorization</td>\n</tr>\n<tr>\n<td>404</td>\n<td>The thing you are looking does not exist</td>\n</tr>\n<tr>\n<td>409</td>\n<td>Your update was rejected because you relate to an outdated version (maybe this item was changed in the meantime) _</td>\n</tr>\n<tr>\n<td>or_ the item could not be created because the key already exists</td>\n<td></td>\n</tr>\n<tr>\n<td>500</td>\n<td>The \"You are not to blame\" error; something unexpected went wrong while processing the request</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"further-information\" style=\"position:relative;\"><a href=\"#further-information\" aria-label=\"further information permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Further information</h3>\n<p>Whenever possible, an error response contains useful details about the error in a simple json format. These information\nare <em>not</em> translated, so this is the responsibility of the frontend.</p>\n<table>\n<thead>\n<tr>\n<th>key</th>\n<th>content</th>\n<th>availability</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>transactionId</td>\n<td>A unique id to link your request to log messages</td>\n<td>always</td>\n</tr>\n<tr>\n<td>errorCode</td>\n<td>A code that can be used for translated error messages. To prevent the usage of the same codes in different exceptions we decided to use generated ids.</td>\n<td>always</td>\n</tr>\n<tr>\n<td>context</td>\n<td>(repo/key, branch/key, ...)</td>\n<td>optional</td>\n</tr>\n<tr>\n<td>message</td>\n<td>An english error message (not necessarily for end users)</td>\n<td>always</td>\n</tr>\n<tr>\n<td>url</td>\n<td>A URL to a site providing further information about the error</td>\n<td>optional</td>\n</tr>\n</tbody>\n</table>\n<p>Error objects will contain no stack traces.</p>\n<p>For SCM exceptions, the message will be created from the message of the java exception. For other exceptions this will\nbe a generic message in most cases.</p>\n<p>Here is an example, how a concrete exception may look like in a json response:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"transactionId\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"7D82atGf3\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"errorCode\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"H823fFAt\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"context\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"repository\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"scmmanager/test\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"branch\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"master\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"file\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\".gitignore\"</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"message\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"file not found\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"url\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"https://www.scm-manager.org/errors/H823fFAt\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"missing-resources-404\" style=\"position:relative;\"><a href=\"#missing-resources-404\" aria-label=\"missing resources 404 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Missing resources (404)</h3>\n<p>The http status code 404 is a special case, because it is a fundamental status code that can be created on a lot of\nevents:</p>\n<ul>\n<li>Your proxy has a misconfiguration and you are talking with a static website instead of SCM-Manager</li>\n<li>You are using a path without a valid endpoint in SCM-Manager</li>\n<li>You are requesting a entity that does not exists</li>\n</ul>\n<p>Some say, that you should not try to interpret the body of a 404 response, because the origin of the response cannot be\ntaken for granted. Nonetheless we decided to use this http status code to indicate requests for missing resources,\nbecause in our view this is what most people would expect.</p>\n<h3 id=\"internal-errors-500\" style=\"position:relative;\"><a href=\"#internal-errors-500\" aria-label=\"internal errors 500 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Internal errors (500)</h3>\n<p>Internal errors boil down to the following message: An error occured, that could not be handled in a reasonable way by\nthe program. In these cases often only an administrator can help. Examples are out-of-memory errors, failing disk I/O,\ntimeouts accessing other services, or (to be honest) simple programming errors that have to be fixed in further\nreleases. To be able to trace these errors in the logs one can use the transaction ids.</p>\n<h2 id=\"gui\" style=\"position:relative;\"><a href=\"#gui\" aria-label=\"gui permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>GUI</h2>\n<p>As an end user of the SCM-Manager I would not like to see confusing internals, but rather have a meaningful message in\nmy language of choice. Therefore it is necessary to identify error types on a fine level. This can be done using the\nerrorCode provided in each error object.</p>\n<p>Basically we have to differentiate between errors the user can handle (\"user errors\") and technical exceptions. For user\nerrors a meaningful message can be generated giving hints to what the user has done \"wrong\". All other exceptions can be\nhandled by displaying a \"sorry, this did not work as expected\" message with the transaction id.</p>\n<h2 id=\"resources--best-practices\" style=\"position:relative;\"><a href=\"#resources--best-practices\" aria-label=\"resources  best practices permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Resources / Best Practices</h2>\n<p>While creating this concepts we tried to adhere to best practices considering APIs of Twitter, Facebook, Bing, Spotify\nand others, as summarized in the following articles:</p>\n<ul>\n<li><a href=\"https://apigee.com/about/blog/technology/restful-api-design-what-about-errors\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">RESTful API Design: What About Errors? (Apigee)</a></li>\n<li><a href=\"https://nordicapis.com/best-practices-api-error-handling/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Best Practices for API Error Handling (Nordic APIS)</a></li>\n</ul>","description":"As a highly extensible product, SCM-Manager offers at least three ways to interact with: the GUI, the REST API, and the Java API Having these three layers, the…","tableOfContents":"<ul>\n<li>\n<p><a href=\"#java-api\">Java API</a></p>\n<ul>\n<li>\n<p><a href=\"#used-exceptions\">Used exceptions</a></p>\n<ul>\n<li><a href=\"#notfoundexception\"><code class=\"language-text\">NotFoundException</code></a></li>\n<li><a href=\"#alreadyexistsexception\"><code class=\"language-text\">AlreadyExistsException</code></a></li>\n<li><a href=\"#concurrentmodificationexception\"><code class=\"language-text\">ConcurrentModificationException</code></a></li>\n<li><a href=\"#nativerepositoryaccessexception\"><code class=\"language-text\">NativeRepositoryAccessException</code></a></li>\n<li><a href=\"#resteasyviolationexception\"><code class=\"language-text\">ResteasyViolationException</code></a></li>\n<li><a href=\"#all-other-runtime-exceptions\">All other runtime exceptions</a></li>\n<li><a href=\"#checked-exceptions\">Checked exceptions</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#enrichment-of-exceptions\">Enrichment of exceptions</a></p>\n<ul>\n<li><a href=\"#context\">Context</a></li>\n<li><a href=\"#transaction-ids\">Transaction IDs</a></li>\n<li><a href=\"#identification-of-exceptions\">Identification of exceptions</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#logging-of-exceptions\">Logging of exceptions</a></p>\n</li>\n</ul>\n</li>\n<li>\n<p><a href=\"#rest-api\">REST API</a></p>\n<ul>\n<li><a href=\"#status-codes\">Status codes</a></li>\n<li><a href=\"#further-information\">Further information</a></li>\n<li><a href=\"#missing-resources-404\">Missing resources (404)</a></li>\n<li><a href=\"#internal-errors-500\">Internal errors (500)</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#gui\">GUI</a></p>\n</li>\n<li>\n<p><a href=\"#resources--best-practices\">Resources / Best Practices</a></p>\n</li>\n</ul>","frontmatter":{"title":"Error Handling","subtitle":null,"displayToc":null,"description":null,"keywords":null,"image":null}}},"pageContext":{"slug":"/docs/3.9.x/en/development/error-handling/","version":"3.9.x","latestVersion":"3.11.x","latestPageVersion":"3.11.x","language":"en","relativePath":"/development/error-handling/","canonicalPath":"/docs/latest/en/development/error-handling/","latestRootPath":"/docs/3.11.x/en/"}},
    "staticQueryHashes": ["1973669194","2742214048","2956773653","2957019495","698804963"]}