Repository: exasol/integration-test-docker-environment (language: python)

Issue:
Streamline error messages
Use the error-reporting-python library and its errors to streamline the error messages.

> We need to replace this at some point with https://github.com/exasol/error-reporting-python. Please create ticket, that we introduce error-reporting-python.

_Originally posted by @tkilias in https://github.com/exasol/integration-test-docker-environment/pull/180#discussion_r812877812_


Discussion / hints:

Fix patch:
diff --git a/doc/changes/changelog.md b/doc/changes/changelog.md
index 5b58aa0e0..af59b6e01 100644
--- a/doc/changes/changelog.md
+++ b/doc/changes/changelog.md
@@ -1,5 +1,6 @@
 # Changes
 
+* [2.0.1](changes_2.0.1.md)
 * [2.0.0](changes_2.0.0.md)
 * [1.7.1](changes_1.7.1.md)
 * [1.7.0](changes_1.7.0.md)
@@ -29,6 +30,7 @@
 ---
 hidden:
 ---
+changes_2.0.1
 changes_2.0.0
 changes_1.7.1
 changes_1.7.0
diff --git a/doc/changes/changes_2.0.1.md b/doc/changes/changes_2.0.1.md
new file mode 100644
index 000000000..d505609ae
--- /dev/null
+++ b/doc/changes/changes_2.0.1.md
@@ -0,0 +1,13 @@
+# Unreleased
+
+## Summary
+
+### Supported Exasol Versions
+
+* **7.1**: up to 7.1.17
+* **8**: 8.18.1
+
+## Internal
+
+* #184: Streamlined error messages
+  * Added exasol-error-reporting library
diff --git a/poetry.lock b/poetry.lock
index 68b819c26..2f79bafd9 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,10 +1,9 @@
-# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
 
 [[package]]
 name = "alabaster"
 version = "0.7.13"
 description = "A configurable sidebar-enabled Sphinx theme"
-category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -16,7 +15,6 @@ files = [
 name = "argcomplete"
 version = "2.1.2"
 description = "Bash tab completion for argparse"
-category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -32,7 +30,6 @@ test = ["coverage", "flake8", "mypy", "pexpect", "wheel"]
 name = "babel"
 version = "2.12.1"
 description = "Internationalization utilities"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -47,7 +44,6 @@ pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""}
 name = "bcrypt"
 version = "4.0.1"
 description = "Modern password hashing for your software and your servers"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -82,7 +78,6 @@ typecheck = ["mypy"]
 name = "beautifulsoup4"
 version = "4.12.2"
 description = "Screen-scraping library"
-category = "dev"
 optional = false
 python-versions = ">=3.6.0"
 files = [
@@ -101,7 +96,6 @@ lxml = ["lxml"]
 name = "certifi"
 version = "2023.5.7"
 description = "Python package for providing Mozilla's CA Bundle."
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -113,7 +107,6 @@ files = [
 name = "cffi"
 version = "1.15.1"
 description = "Foreign Function Interface for Python calling C code."
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -190,7 +183,6 @@ pycparser = "*"
 name = "charset-normalizer"
 version = "3.1.0"
 description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-category = "main"
 optional = false
 python-versions = ">=3.7.0"
 files = [
@@ -275,7 +267,6 @@ files = [
 name = "click"
 version = "8.1.3"
 description = "Composable command line interface toolkit"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -290,7 +281,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
 name = "colorama"
 version = "0.4.6"
 description = "Cross-platform colored terminal text."
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
 files = [
@@ -302,7 +292,6 @@ files = [
 name = "colorlog"
 version = "6.7.0"
 description = "Add colours to the output of Python's logging module."
-category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -320,7 +309,6 @@ development = ["black", "flake8", "mypy", "pytest", "types-colorama"]
 name = "cryptography"
 version = "41.0.1"
 description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -362,7 +350,6 @@ test-randomorder = ["pytest-randomly"]
 name = "decorator"
 version = "5.1.1"
 description = "Decorators for Humans"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -374,7 +361,6 @@ files = [
 name = "distlib"
 version = "0.3.6"
 description = "Distribution utilities"
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -386,7 +372,6 @@ files = [
 name = "docker"
 version = "6.1.3"
 description = "A Python library for the Docker Engine API."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -407,7 +392,6 @@ ssh = ["paramiko (>=2.4.3)"]
 name = "docutils"
 version = "0.17.1"
 description = "Docutils -- Python Documentation Utilities"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 files = [
@@ -419,7 +403,6 @@ files = [
 name = "exasol-bucketfs"
 version = "0.8.0"
 description = "BucketFS utilities for the Python programming language"
-category = "main"
 optional = false
 python-versions = ">=3.8,<4.0"
 files = [
@@ -432,11 +415,21 @@ joblib = ">=1.0.1"
 requests = ">=2.24.0"
 typeguard = ">=2.11.1,<3.0.0"
 
+[[package]]
+name = "exasol-error-reporting"
+version = "0.4.0"
+description = "Exasol Python Error Reporting"
+optional = false
+python-versions = ">=3.8,<4.0"
+files = [
+    {file = "exasol_error_reporting-0.4.0-py3-none-any.whl", hash = "sha256:851aed9fd95bc3c6a566ba174a8052897442bfe503c9b8858faab26e3d6f0153"},
+    {file = "exasol_error_reporting-0.4.0.tar.gz", hash = "sha256:a0bc5056aa23df97eb47d2da95d112d9b2dcd5295016fdefac2fc7aa5e7eea19"},
+]
+
 [[package]]
 name = "exasol-sphinx-github-pages-generator"
 version = "0.1.1"
 description = "Generates Sphinx GitHub pages for a given Git Repository"
-category = "dev"
 optional = false
 python-versions = ">=3.8,<4.0"
 files = []
@@ -460,7 +453,6 @@ resolved_reference = "9692e4384b6ba9cbede3ad8510523ebf4f36b830"
 name = "exceptiongroup"
 version = "1.1.1"
 description = "Backport of PEP 654 (exception groups)"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -475,7 +467,6 @@ test = ["pytest (>=6)"]
 name = "fabric"
 version = "3.1.0"
 description = "High level SSH command execution"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -495,7 +486,6 @@ pytest = ["pytest (>=7)"]
 name = "filelock"
 version = "3.12.2"
 description = "A platform independent file lock."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -511,7 +501,6 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p
 name = "furo"
 version = "2022.9.29"
 description = "A clean customisable Sphinx documentation theme."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -529,7 +518,6 @@ sphinx-basic-ng = "*"
 name = "gitdb"
 version = "4.0.10"
 description = "Git Object Database"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -544,7 +532,6 @@ smmap = ">=3.0.1,<6"
 name = "gitpython"
 version = "3.1.31"
 description = "GitPython is a Python library used to interact with Git repositories"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -559,7 +546,6 @@ gitdb = ">=4.0.1,<5"
 name = "humanfriendly"
 version = "10.0"
 description = "Human friendly output for text interfaces using Python"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 files = [
@@ -574,7 +560,6 @@ pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_ve
 name = "idna"
 version = "3.4"
 description = "Internationalized Domain Names in Applications (IDNA)"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -586,7 +571,6 @@ files = [
 name = "imagesize"
 version = "1.4.1"
 description = "Getting image size from png/jpeg/jpeg2000/gif file"
-category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -598,7 +582,6 @@ files = [
 name = "importlib-metadata"
 version = "6.6.0"
 description = "Read metadata from Python packages"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -618,7 +601,6 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag
 name = "importlib-resources"
 version = "5.12.0"
 description = "Read resources from Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -637,7 +619,6 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec
 name = "iniconfig"
 version = "2.0.0"
 description = "brain-dead simple config-ini parsing"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -649,7 +630,6 @@ files = [
 name = "invoke"
 version = "2.1.3"
 description = "Pythonic task execution"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -661,7 +641,6 @@ files = [
 name = "jinja2"
 version = "3.1.2"
 description = "A very fast and expressive template engine."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -679,7 +658,6 @@ i18n = ["Babel (>=2.7)"]
 name = "joblib"
 version = "1.2.0"
 description = "Lightweight pipelining with Python functions"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -691,7 +669,6 @@ files = [
 name = "jsonpickle"
 version = "3.0.1"
 description = "Python library for serializing any arbitrary object graph into JSON"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -708,7 +685,6 @@ testing-libs = ["simplejson", "ujson"]
 name = "lockfile"
 version = "0.12.2"
 description = "Platform-independent file locking module"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -720,7 +696,6 @@ files = [
 name = "luigi"
 version = "3.3.0"
 description = "Workflow mgmgt + task scheduling + dependency resolution."
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -742,7 +717,6 @@ toml = ["toml (<2.0.0)"]
 name = "markdown-it-py"
 version = "2.2.0"
 description = "Python port of markdown-it. Markdown parsing, done right!"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -767,7 +741,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
 name = "markupsafe"
 version = "2.1.3"
 description = "Safely add untrusted strings to HTML/XML markup."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -791,6 +764,16 @@ files = [
     {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
     {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
     {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
+    {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
+    {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
+    {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
+    {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
+    {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
+    {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
+    {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
+    {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
+    {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
+    {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
     {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
     {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
     {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
@@ -827,7 +810,6 @@ files = [
 name = "mdit-py-plugins"
 version = "0.3.5"
 description = "Collection of plugins for markdown-it-py"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -847,7 +829,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
 name = "mdurl"
 version = "0.1.2"
 description = "Markdown URL utilities"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -859,7 +840,6 @@ files = [
 name = "mypy"
 version = "1.3.0"
 description = "Optional static typing for Python"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -906,7 +886,6 @@ reports = ["lxml"]
 name = "mypy-extensions"
 version = "1.0.0"
 description = "Type system extensions for programs checked with the mypy type checker."
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -918,7 +897,6 @@ files = [
 name = "myst-parser"
 version = "0.17.2"
 description = "An extended commonmark compliant parser, with bridges to docutils & sphinx."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -945,7 +923,6 @@ testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest
 name = "netaddr"
 version = "0.8.0"
 description = "A network address manipulation library for Python"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -957,7 +934,6 @@ files = [
 name = "networkx"
 version = "3.1"
 description = "Python package for creating and manipulating graphs and networks"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -976,7 +952,6 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"]
 name = "nox"
 version = "2022.11.21"
 description = "Flexible test automation."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -997,7 +972,6 @@ tox-to-nox = ["jinja2", "tox"]
 name = "packaging"
 version = "23.1"
 description = "Core utilities for Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1009,7 +983,6 @@ files = [
 name = "paramiko"
 version = "3.2.0"
 description = "SSH2 protocol library"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1031,7 +1004,6 @@ invoke = ["invoke (>=2.0)"]
 name = "platformdirs"
 version = "3.5.3"
 description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1047,7 +1019,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-
 name = "pluggy"
 version = "1.0.0"
 description = "plugin and hook calling mechanisms for python"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1063,7 +1034,6 @@ testing = ["pytest", "pytest-benchmark"]
 name = "portalocker"
 version = "2.7.0"
 description = "Wraps the portalocker recipe for easy usage"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -1083,7 +1053,6 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p
 name = "pyasn1"
 version = "0.5.0"
 description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)"
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
 files = [
@@ -1095,7 +1064,6 @@ files = [
 name = "pycparser"
 version = "2.21"
 description = "C parser in Python"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -1107,7 +1075,6 @@ files = [
 name = "pydot"
 version = "1.4.2"
 description = "Python interface to Graphviz's Dot"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -1122,7 +1089,6 @@ pyparsing = ">=2.1.4"
 name = "pyexasol"
 version = "0.25.2"
 description = "Exasol python driver with extra features"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1147,7 +1113,6 @@ ujson = ["ujson"]
 name = "pygments"
 version = "2.15.1"
 description = "Pygments is a syntax highlighting package written in Python."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1162,7 +1127,6 @@ plugins = ["importlib-metadata"]
 name = "pynacl"
 version = "1.5.0"
 description = "Python binding to the Networking and Cryptography (NaCl) library"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1189,7 +1153,6 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"]
 name = "pyopenssl"
 version = "23.2.0"
 description = "Python wrapper module around the OpenSSL library"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1208,7 +1171,6 @@ test = ["flaky", "pretend", "pytest (>=3.0.1)"]
 name = "pyparsing"
 version = "3.0.9"
 description = "pyparsing module - Classes and methods to define and execute parsing grammars"
-category = "main"
 optional = false
 python-versions = ">=3.6.8"
 files = [
@@ -1223,7 +1185,6 @@ diagrams = ["jinja2", "railroad-diagrams"]
 name = "pyreadline3"
 version = "3.4.1"
 description = "A python implementation of GNU readline."
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -1235,7 +1196,6 @@ files = [
 name = "pytest"
 version = "7.3.2"
 description = "pytest: simple powerful testing with Python"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1258,7 +1218,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no
 name = "python-daemon"
 version = "3.0.1"
 description = "Library to implement a well-behaved Unix daemon process."
-category = "main"
 optional = false
 python-versions = ">=3"
 files = [
@@ -1279,7 +1238,6 @@ test = ["coverage", "docutils", "testscenarios (>=0.4)", "testtools"]
 name = "python-dateutil"
 version = "2.8.2"
 description = "Extensions to the standard Python datetime module"
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
 files = [
@@ -1294,7 +1252,6 @@ six = ">=1.5"
 name = "pytz"
 version = "2023.3"
 description = "World timezone definitions, modern and historical"
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1306,7 +1263,6 @@ files = [
 name = "pywin32"
 version = "306"
 description = "Python for Window Extensions"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -1330,7 +1286,6 @@ files = [
 name = "pyyaml"
 version = "6.0"
 description = "YAML parser and emitter for Python"
-category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1380,7 +1335,6 @@ files = [
 name = "requests"
 version = "2.31.0"
 description = "Python HTTP for Humans."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1402,7 +1356,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
 name = "rsa"
 version = "4.9"
 description = "Pure-Python RSA implementation"
-category = "main"
 optional = false
 python-versions = ">=3.6,<4"
 files = [
@@ -1417,7 +1370,6 @@ pyasn1 = ">=0.1.3"
 name = "setuptools"
 version = "67.8.0"
 description = "Easily download, build, install, upgrade, and uninstall Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1434,7 +1386,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (
 name = "simplejson"
 version = "3.19.1"
 description = "Simple, fast, extensible JSON encoder/decoder for Python"
-category = "main"
 optional = false
 python-versions = ">=2.5, !=3.0.*, !=3.1.*, !=3.2.*"
 files = [
@@ -1529,7 +1480,6 @@ files = [
 name = "six"
 version = "1.16.0"
 description = "Python 2 and 3 compatibility utilities"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 files = [
@@ -1541,7 +1491,6 @@ files = [
 name = "smmap"
 version = "5.0.0"
 description = "A pure Python implementation of a sliding window memory map manager"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1553,7 +1502,6 @@ files = [
 name = "snowballstemmer"
 version = "2.2.0"
 description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1565,7 +1513,6 @@ files = [
 name = "soupsieve"
 version = "2.4.1"
 description = "A modern CSS selector implementation for Beautiful Soup."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1577,7 +1524,6 @@ files = [
 name = "sphinx"
 version = "4.5.0"
 description = "Python documentation generator"
-category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1613,7 +1559,6 @@ test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"]
 name = "sphinx-basic-ng"
 version = "1.0.0b1"
 description = "A modern skeleton for Sphinx themes."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1631,7 +1576,6 @@ docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-ta
 name = "sphinxcontrib-applehelp"
 version = "1.0.4"
 description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1647,7 +1591,6 @@ test = ["pytest"]
 name = "sphinxcontrib-devhelp"
 version = "1.0.2"
 description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -1663,7 +1606,6 @@ test = ["pytest"]
 name = "sphinxcontrib-htmlhelp"
 version = "2.0.1"
 description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1679,7 +1621,6 @@ test = ["html5lib", "pytest"]
 name = "sphinxcontrib-jsmath"
 version = "1.0.1"
 description = "A sphinx extension which renders display math in HTML via JavaScript"
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -1694,7 +1635,6 @@ test = ["flake8", "mypy", "pytest"]
 name = "sphinxcontrib-qthelp"
 version = "1.0.3"
 description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -1710,7 +1650,6 @@ test = ["pytest"]
 name = "sphinxcontrib-serializinghtml"
 version = "1.1.5"
 description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -1726,7 +1665,6 @@ test = ["pytest"]
 name = "stopwatch-py"
 version = "2.0.1"
 description = "A simple stopwatch for python"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -1738,7 +1676,6 @@ files = [
 name = "tenacity"
 version = "8.2.2"
 description = "Retry code until it succeeds"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1753,7 +1690,6 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"]
 name = "toml"
 version = "0.10.2"
 description = "Python Library for Tom's Obvious, Minimal Language"
-category = "dev"
 optional = false
 python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 files = [
@@ -1765,7 +1701,6 @@ files = [
 name = "tomli"
 version = "2.0.1"
 description = "A lil' TOML parser"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1777,7 +1712,6 @@ files = [
 name = "tornado"
 version = "6.3.2"
 description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
-category = "main"
 optional = false
 python-versions = ">= 3.8"
 files = [
@@ -1798,7 +1732,6 @@ files = [
 name = "typeguard"
 version = "2.13.3"
 description = "Run-time type checker for Python"
-category = "main"
 optional = false
 python-versions = ">=3.5.3"
 files = [
@@ -1814,7 +1747,6 @@ test = ["mypy", "pytest", "typing-extensions"]
 name = "typing-extensions"
 version = "4.6.3"
 description = "Backported and Experimental Type Hints for Python 3.7+"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1826,7 +1758,6 @@ files = [
 name = "urllib3"
 version = "2.0.3"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1844,7 +1775,6 @@ zstd = ["zstandard (>=0.18.0)"]
 name = "virtualenv"
 version = "20.23.0"
 description = "Virtual Python Environment builder"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1865,7 +1795,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess
 name = "websocket-client"
 version = "1.5.3"
 description = "WebSocket client for Python with low level API options"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1882,7 +1811,6 @@ test = ["websockets"]
 name = "zipp"
 version = "3.15.0"
 description = "Backport of pathlib-compatible object wrapper for zip files"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1897,4 +1825,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more
 [metadata]
 lock-version = "2.0"
 python-versions = ">=3.8,<4"
-content-hash = "5ec8ab7f85cb644a0d390a0058ba6957215d0bab718582c6156c3cdfc253ee1b"
+content-hash = "5465ddd60489bf0e4cb775fadd634ff49fe3178f87a6a6565fb310e654a574c0"
diff --git a/pyproject.toml b/pyproject.toml
index a7c8513b5..d2b51273c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ packages = [
     { include = "exasol_integration_test_docker_environment" },
     { include = "pytest_itde" }
 ]
-version = "2.0.0"
+version = "2.0.1"
 description = "Integration Test Docker Environment for Exasol"
 
 license = "MIT"
@@ -45,6 +45,7 @@ pytest = "^7.2.2"
 pyexasol = "^0.25.2"
 fabric = "^3.0.1"
 portalocker = "^2.7.0"
+exasol-error-reporting = "^0.4.0"
 
 [tool.poetry.plugins.pytest11]
 itde = "pytest_itde"


Test patch:
diff --git a/exasol_integration_test_docker_environment/doctor.py b/exasol_integration_test_docker_environment/doctor.py
index 4a5555b8e..57e489610 100644
--- a/exasol_integration_test_docker_environment/doctor.py
+++ b/exasol_integration_test_docker_environment/doctor.py
@@ -3,8 +3,9 @@
 package and also provide help to find potential fixes.
 """
 import sys
+from typing import Iterable
+from exasol import error
 from enum import Enum
-from typing import Iterator
 
 import docker
 from docker.errors import DockerException
@@ -12,38 +13,44 @@
 SUPPORTED_PLATFORMS = ["linux", "darwin"]
 
 
-class ErrorCodes(Enum):
-    """The equivalent of ICD-10 codes this doctor is using"""
+class Error(Enum):
+    Unknown = error.ExaError(
+        "E-ITDE-0",
+        "Unknown issue.",
+        ["An unknown error occurred, please contact the maintainer."],
+        {}
+    )
 
-    Unknown = "Unknown issue"
-    UnixSocketNotAvailable = "Could not find unix socket to connect to"
-    TargetPlatformNotSupported = "The platform you are running on is not supported."
+    UnixSocketNotAvailable = error.ExaError(
+        "E-ITDE-1",
+        "Could not find unix socket to connect to.",
+        ["Make sure environment variable DOCKER_HOST is configured correctly."],
+        {}
+    )
 
+    TargetPlatformNotSupported = error.ExaError(
+        "E-ITDE-2",
+        "The platform ITDE is running on is not supported.",
+        ["Make sure you are using one of the following platforms: [linux, darwin]."],
+        {}
+    )
 
-def recommend_mitigation(error_code) -> str:
-    """Get treatment advice based on the error_code"""
-    return {
-        ErrorCodes.Unknown: "You are sick but this symptoms are unknown, please contact the maintainer.",
-        ErrorCodes.UnixSocketNotAvailable: "Make sure your DOCKER_HOST environment variable is configured correctly.",
-        ErrorCodes.TargetPlatformNotSupported: f"Make sure you are using one of the following platforms: {SUPPORTED_PLATFORMS}.",
-    }[error_code]
 
-
-def diagnose_docker_daemon_not_available() -> Iterator[ErrorCodes]:
+def diagnose_docker_daemon_not_available() -> Iterable[error.ExaError]:
     """Diagnose reasons why docker deamon is not available"""
 
     def _is_unix_socket_issue(message: str) -> bool:
         return "FileNotFoundError(2, 'No such file or directory')" in message
 
-    errors = set()
+    errors = list()
     try:
         _docker = docker.from_env()
     except DockerException as ex:
         msg = f"{ex}"
         if _is_unix_socket_issue(msg):
-            errors.add(ErrorCodes.UnixSocketNotAvailable)
+            errors.append(Error.UnixSocketNotAvailable)
         if len(errors) == 0:
-            errors.add(ErrorCodes.Unknown)
+            errors.append(Error.Unknown)
     return errors
 
 
@@ -65,7 +72,7 @@ def is_supported_platform() -> bool:
     return sys.platform in SUPPORTED_PLATFORMS
 
 
-def health_checkup() -> Iterator[ErrorCodes]:
+def health_checkup() -> Iterable[error.ExaError]:
     """
     Runs all known examinations
 
@@ -73,7 +80,7 @@ def health_checkup() -> Iterator[ErrorCodes]:
     """
     examinations = [
         (is_docker_daemon_available, diagnose_docker_daemon_not_available),
-        (is_supported_platform, lambda: ErrorCodes.TargetPlatformNotSupported),
+        (is_supported_platform, lambda: Error.TargetPlatformNotSupported),
     ]
     for is_fine, diagnosis in examinations:
         if not is_fine():
diff --git a/exasol_integration_test_docker_environment/lib/api/health.py b/exasol_integration_test_docker_environment/lib/api/health.py
index c3f941c88..9e524a0b7 100644
--- a/exasol_integration_test_docker_environment/lib/api/health.py
+++ b/exasol_integration_test_docker_environment/lib/api/health.py
@@ -1,6 +1,6 @@
 from inspect import cleandoc
 
-from exasol_integration_test_docker_environment.doctor import health_checkup, recommend_mitigation
+from exasol_integration_test_docker_environment.doctor import health_checkup
 from exasol_integration_test_docker_environment.lib.api.api_errors import HealthProblem
 from exasol_integration_test_docker_environment.lib.api.common import cli_function
 
@@ -17,16 +17,10 @@ def health():
     :raises HealthProblem
     """
 
-    problems = set(health_checkup())
-    if not problems:
+    errors = set(health_checkup())
+    if not errors:
         return
 
-    suggestion_template = cleandoc(
-        """
-        * {problem}
-          Fix: {suggestion}
-        """
-    )
     message = cleandoc(
         """
         {count} problem(s) have been identified.
@@ -34,14 +28,7 @@ def health():
         {problems}
         """
     ).format(
-        count=len(problems),
-        problems="\n".join(
-            (
-                suggestion_template.format(
-                    problem=icd.value, suggestion=recommend_mitigation(icd)
-                )
-                for icd in problems
-            )
-        ),
+        count=len(errors),
+        problems="\n".join(f"{error.value}" for error in errors),
     )
     raise HealthProblem(message)
diff --git a/exasol_integration_test_docker_environment/test/test_doctor.py b/exasol_integration_test_docker_environment/test/test_doctor.py
index 127a28f61..add497c86 100644
--- a/exasol_integration_test_docker_environment/test/test_doctor.py
+++ b/exasol_integration_test_docker_environment/test/test_doctor.py
@@ -6,7 +6,7 @@
 
 from exasol_integration_test_docker_environment.doctor import (
     SUPPORTED_PLATFORMS,
-    ErrorCodes,
+    Error,
     diagnose_docker_daemon_not_available,
     is_docker_daemon_available,
     is_supported_platform,
@@ -56,13 +56,13 @@ class DiagnoseDockerDaemonNotAvailable(unittest.TestCase):
     """
 
     def test_non_existing_unix_socket(self):
-        expected = {ErrorCodes.UnixSocketNotAvailable}
+        expected = [Error.UnixSocketNotAvailable]
         env = {"DOCKER_HOST": "unix:///var/non/existent/path"}
         with temporary_env(env):
             self.assertEqual(expected, diagnose_docker_daemon_not_available())
 
     def test_unknown_error(self):
-        expected = {ErrorCodes.Unknown}
+        expected = [Error.Unknown]
         env = {"DOCKER_HOST": "https://foobar"}
         with temporary_env(env):
             self.assertEqual(expected, diagnose_docker_daemon_not_available())