prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  ClusterError class should implement its own version of __str__ method
  <!--
  General questions should be asked on the mailing list modin-dev@googlegroups.com.
  
  Before submitting an issue, please fill out the following form.
  -->
  
  ### System information
  - **OS Platform and Distribution (e.g., Linux Ubuntu 16.04)**:
  - **Modin installed from (source or binary)**:
  - **Modin version**:
  - **Python version**:
  - **Exact command to reproduce**:
  
  <!--
  You can obtain the Modin version with
  
  python -c "import modin; print(modin.__version__)"
  -->
  
  ### Describe the problem
  <!-- Describe the problem clearly here. -->
  `ClusterError` includes the `cause` field that is not printed. This makes it difficult to understand the problems that cause exceptions.
  
  ### Source code / logs
  <!-- Include any logs or source code that would be helpful to diagnose the problem. If including tracebacks, please include the full traceback. Large logs and files should be attached. Try to provide a reproducible test case that is the bare minimum necessary to generate the problem. -->
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `modin/experimental/cloud/base.py`
  Content:
  ```
  1 # Licensed to Modin Development Team under one or more contributor license agreements.
  2 # See the NOTICE file distributed with this work for additional information regarding
  3 # copyright ownership.  The Modin Development Team licenses this file to you under the
  4 # Apache License, Version 2.0 (the "License"); you may not use this file except in
  5 # compliance with the License.  You may obtain a copy of the License at
  6 #
  7 #     http://www.apache.org/licenses/LICENSE-2.0
  8 #
  9 # Unless required by applicable law or agreed to in writing, software distributed under
  10 # the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
  11 # ANY KIND, either express or implied. See the License for the specific language
  12 # governing permissions and limitations under the License.
  13 
  14 from typing import NamedTuple
  15 import os
  16 import sys
  17 
  18 
  19 class ClusterError(Exception):
  20     """
  21     Generic cluster operating exception
  22     """
  23 
  24     def __init__(self, *args, cause: BaseException = None, traceback: str = None, **kw):
  25         self.cause = cause
  26         self.traceback = traceback
  27         super().__init__(*args, **kw)
  28 
  29 
  30 class CannotSpawnCluster(ClusterError):
  31     """
  32     Raised when cluster cannot be spawned in the cloud
  33     """
  34 
  35 
  36 class CannotDestroyCluster(ClusterError):
  37     """
  38     Raised when cluster cannot be destroyed in the cloud
  39     """
  40 
  41 
  42 class ConnectionDetails(NamedTuple):
  43     user_name: str = "modin"
  44     key_file: str = None
  45     address: str = None
  46     port: int = 22
  47 
  48 
  49 _EXT = (".exe", ".com", ".cmd", ".bat", "") if sys.platform == "win32" else ("",)
  50 
  51 
  52 def _which(prog):
  53     for entry in os.environ["PATH"].split(os.pathsep):
  54         for ext in _EXT:
  55             path = os.path.join(entry, prog + ext)
  56             if os.access(path, os.X_OK):
  57                 return path
  58     return None
  59 
  60 
  61 def _get_ssh_proxy_command():
  62     socks_proxy = os.environ.get("MODIN_SOCKS_PROXY", None)
  63     if socks_proxy is None:
  64         return None
  65     if _which("nc"):
  66         return f"nc -x {socks_proxy} %h %p"
  67     elif _which("connect"):
  68         return f"connect -S {socks_proxy} %h %p"
  69     raise ClusterError(
  70         "SSH through proxy required but no supported proxying tools found"
  71     )
  72
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/modin/experimental/cloud/base.py b/modin/experimental/cloud/base.py
  --- a/modin/experimental/cloud/base.py
  +++ b/modin/experimental/cloud/base.py
  @@ -26,6 +26,11 @@
           self.traceback = traceback
           super().__init__(*args, **kw)
   
  +    def __str__(self):
  +        if self.clause:
  +            return f"clause: {self.cause}\n{super()}"
  +        return str(super())
  +
   
   class CannotSpawnCluster(ClusterError):
       """
  
verification_info: {"golden_diff": "diff --git a/modin/experimental/cloud/base.py b/modin/experimental/cloud/base.py\n--- a/modin/experimental/cloud/base.py\n+++ b/modin/experimental/cloud/base.py\n@@ -26,6 +26,11 @@\n         self.traceback = traceback\n         super().__init__(*args, **kw)\n \n+    def __str__(self):\n+        if self.clause:\n+            return f\"clause: {self.cause}\\n{super()}\"\n+        return str(super())\n+\n \n class CannotSpawnCluster(ClusterError):\n     \"\"\"\n", "issue": "ClusterError class should implement its own version of __str__ method\n<!--\r\nGeneral questions should be asked on the mailing list modin-dev@googlegroups.com.\r\n\r\nBefore submitting an issue, please fill out the following form.\r\n-->\r\n\r\n### System information\r\n- **OS Platform and Distribution (e.g., Linux Ubuntu 16.04)**:\r\n- **Modin installed from (source or binary)**:\r\n- **Modin version**:\r\n- **Python version**:\r\n- **Exact command to reproduce**:\r\n\r\n<!--\r\nYou can obtain the Modin version with\r\n\r\npython -c \"import modin; print(modin.__version__)\"\r\n-->\r\n\r\n### Describe the problem\r\n<!-- Describe the problem clearly here. -->\r\n`ClusterError` includes the `cause` field that is not printed. This makes it difficult to understand the problems that cause exceptions.\r\n\r\n### Source code / logs\r\n<!-- Include any logs or source code that would be helpful to diagnose the problem. If including tracebacks, please include the full traceback. Large logs and files should be attached. Try to provide a reproducible test case that is the bare minimum necessary to generate the problem. -->\r\n\n", "before_files": [{"content": "# Licensed to Modin Development Team under one or more contributor license agreements.\n# See the NOTICE file distributed with this work for additional information regarding\n# copyright ownership.  The Modin Development Team licenses this file to you under the\n# Apache License, Version 2.0 (the \"License\"); you may not use this file except in\n# compliance with the License.  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software distributed under\n# the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n# ANY KIND, either express or implied. See the License for the specific language\n# governing permissions and limitations under the License.\n\nfrom typing import NamedTuple\nimport os\nimport sys\n\n\nclass ClusterError(Exception):\n    \"\"\"\n    Generic cluster operating exception\n    \"\"\"\n\n    def __init__(self, *args, cause: BaseException = None, traceback: str = None, **kw):\n        self.cause = cause\n        self.traceback = traceback\n        super().__init__(*args, **kw)\n\n\nclass CannotSpawnCluster(ClusterError):\n    \"\"\"\n    Raised when cluster cannot be spawned in the cloud\n    \"\"\"\n\n\nclass CannotDestroyCluster(ClusterError):\n    \"\"\"\n    Raised when cluster cannot be destroyed in the cloud\n    \"\"\"\n\n\nclass ConnectionDetails(NamedTuple):\n    user_name: str = \"modin\"\n    key_file: str = None\n    address: str = None\n    port: int = 22\n\n\n_EXT = (\".exe\", \".com\", \".cmd\", \".bat\", \"\") if sys.platform == \"win32\" else (\"\",)\n\n\ndef _which(prog):\n    for entry in os.environ[\"PATH\"].split(os.pathsep):\n        for ext in _EXT:\n            path = os.path.join(entry, prog + ext)\n            if os.access(path, os.X_OK):\n                return path\n    return None\n\n\ndef _get_ssh_proxy_command():\n    socks_proxy = os.environ.get(\"MODIN_SOCKS_PROXY\", None)\n    if socks_proxy is None:\n        return None\n    if _which(\"nc\"):\n        return f\"nc -x {socks_proxy} %h %p\"\n    elif _which(\"connect\"):\n        return f\"connect -S {socks_proxy} %h %p\"\n    raise ClusterError(\n        \"SSH through proxy required but no supported proxying tools found\"\n    )\n", "path": "modin/experimental/cloud/base.py"}], "after_files": [{"content": "# Licensed to Modin Development Team under one or more contributor license agreements.\n# See the NOTICE file distributed with this work for additional information regarding\n# copyright ownership.  The Modin Development Team licenses this file to you under the\n# Apache License, Version 2.0 (the \"License\"); you may not use this file except in\n# compliance with the License.  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software distributed under\n# the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n# ANY KIND, either express or implied. See the License for the specific language\n# governing permissions and limitations under the License.\n\nfrom typing import NamedTuple\nimport os\nimport sys\n\n\nclass ClusterError(Exception):\n    \"\"\"\n    Generic cluster operating exception\n    \"\"\"\n\n    def __init__(self, *args, cause: BaseException = None, traceback: str = None, **kw):\n        self.cause = cause\n        self.traceback = traceback\n        super().__init__(*args, **kw)\n\n    def __str__(self):\n        if self.clause:\n            return f\"clause: {self.cause}\\n{super()}\"\n        return str(super())\n\n\nclass CannotSpawnCluster(ClusterError):\n    \"\"\"\n    Raised when cluster cannot be spawned in the cloud\n    \"\"\"\n\n\nclass CannotDestroyCluster(ClusterError):\n    \"\"\"\n    Raised when cluster cannot be destroyed in the cloud\n    \"\"\"\n\n\nclass ConnectionDetails(NamedTuple):\n    user_name: str = \"modin\"\n    key_file: str = None\n    address: str = None\n    port: int = 22\n\n\n_EXT = (\".exe\", \".com\", \".cmd\", \".bat\", \"\") if sys.platform == \"win32\" else (\"\",)\n\n\ndef _which(prog):\n    for entry in os.environ[\"PATH\"].split(os.pathsep):\n        for ext in _EXT:\n            path = os.path.join(entry, prog + ext)\n            if os.access(path, os.X_OK):\n                return path\n    return None\n\n\ndef _get_ssh_proxy_command():\n    socks_proxy = os.environ.get(\"MODIN_SOCKS_PROXY\", None)\n    if socks_proxy is None:\n        return None\n    if _which(\"nc\"):\n        return f\"nc -x {socks_proxy} %h %p\"\n    elif _which(\"connect\"):\n        return f\"connect -S {socks_proxy} %h %p\"\n    raise ClusterError(\n        \"SSH through proxy required but no supported proxying tools found\"\n    )\n", "path": "modin/experimental/cloud/base.py"}]}