diff mbox series

[17/20] python/qemu/qmp.py: Preserve error context on re-raise

Message ID 20201006235817.3280413-18-jsnow@redhat.com (mailing list archive)
State New, archived
Headers show
Series python/qemu: strictly typed mypy conversion, pt2 | expand

Commit Message

John Snow Oct. 6, 2020, 11:58 p.m. UTC
Use the "from ..." phrasing when re-raising errors to preserve their
initial context, to help aid debugging when things go wrong.

This also silences a pylint 2.6.0+ error.

Signed-off-by: John Snow <jsnow@redhat.com>
---
 python/qemu/qmp.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

Comments

Philippe Mathieu-Daudé Oct. 7, 2020, 4:58 a.m. UTC | #1
On 10/7/20 1:58 AM, John Snow wrote:
> Use the "from ..." phrasing when re-raising errors to preserve their
> initial context, to help aid debugging when things go wrong.
> 
> This also silences a pylint 2.6.0+ error.
> 
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
>  python/qemu/qmp.py | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/python/qemu/qmp.py b/python/qemu/qmp.py
> index 9223307ed81..d911999da1f 100644
> --- a/python/qemu/qmp.py
> +++ b/python/qemu/qmp.py
> @@ -181,10 +181,11 @@ def __get_events(self, wait: Union[bool, float] = False) -> None:
>                  self.__sock.settimeout(wait)
>              try:
>                  ret = self.__json_read(only_event=True)
> -            except socket.timeout:
> -                raise QMPTimeoutError("Timeout waiting for event")
> -            except:
> -                raise QMPConnectError("Error while reading from socket")
> +            except socket.timeout as err:
> +                raise QMPTimeoutError("Timeout waiting for event") from err
> +            except Exception as err:
> +                msg = "Error while reading from socket"
> +                raise QMPConnectError(msg) from err
>              if ret is None:
>                  raise QMPConnectError("Error while reading from socket")
>              self.__sock.settimeout(None)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Kevin Wolf Oct. 7, 2020, 11:21 a.m. UTC | #2
Am 07.10.2020 um 01:58 hat John Snow geschrieben:
> Use the "from ..." phrasing when re-raising errors to preserve their
> initial context, to help aid debugging when things go wrong.
> 
> This also silences a pylint 2.6.0+ error.
> 
> Signed-off-by: John Snow <jsnow@redhat.com>

I don't really understand what this improves compared to the implicit
chaining we got before, but if pylint says so...

Reviewed-by: Kevin Wolf <kwolf@redhat.com>
John Snow Oct. 7, 2020, 7:03 p.m. UTC | #3
On 10/7/20 7:21 AM, Kevin Wolf wrote:
> Am 07.10.2020 um 01:58 hat John Snow geschrieben:
>> Use the "from ..." phrasing when re-raising errors to preserve their
>> initial context, to help aid debugging when things go wrong.
>>
>> This also silences a pylint 2.6.0+ error.
>>
>> Signed-off-by: John Snow <jsnow@redhat.com>
> 
> I don't really understand what this improves compared to the implicit
> chaining we got before, but if pylint says so...
> 
> Reviewed-by: Kevin Wolf <kwolf@redhat.com>
> 

Yeah, it's a pretty minimal change. Depending on the context, I think it 
makes a bigger difference depending on how far away you are from the 
error you are re-raising, but I couldn't find a great real-world example 
for you right now.

In summary, it changes this line:

"During handling of the above exception, another exception occurred:"

to this one:

"The above exception was the direct cause of the following exception:"

Which disambiguates between wrapping an exception with a more 
semantically meaningful exception class, vs. your handler code itself 
faulted.

Minor change, I know. You are also allowed to use "from None" to 
suppress the chain. I use this in the QAPI series at one point because I 
felt the underlying error was not useful to see in the traceback.

I see the pylint change as forcing you not to rely on the implicit 
chaining. Eh, fine.

--js
diff mbox series

Patch

diff --git a/python/qemu/qmp.py b/python/qemu/qmp.py
index 9223307ed81..d911999da1f 100644
--- a/python/qemu/qmp.py
+++ b/python/qemu/qmp.py
@@ -181,10 +181,11 @@  def __get_events(self, wait: Union[bool, float] = False) -> None:
                 self.__sock.settimeout(wait)
             try:
                 ret = self.__json_read(only_event=True)
-            except socket.timeout:
-                raise QMPTimeoutError("Timeout waiting for event")
-            except:
-                raise QMPConnectError("Error while reading from socket")
+            except socket.timeout as err:
+                raise QMPTimeoutError("Timeout waiting for event") from err
+            except Exception as err:
+                msg = "Error while reading from socket"
+                raise QMPConnectError(msg) from err
             if ret is None:
                 raise QMPConnectError("Error while reading from socket")
             self.__sock.settimeout(None)