On Tue, Oct 20, 2020 at 8:52 PM John Snow <[email protected]> wrote:
>
> Nested if conditions don't change when the exception block fires; we
> need to explicitly re-raise the error if we didn't intend to capture and
> suppress it.
>
> Signed-off-by: John Snow <[email protected]>
> Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
> Message-id: [email protected]
> Signed-off-by: John Snow <[email protected]>
> ---
> python/qemu/qmp.py | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/python/qemu/qmp.py b/python/qemu/qmp.py
> index d911999da1..4969e5741c 100644
> --- a/python/qemu/qmp.py
> +++ b/python/qemu/qmp.py
> @@ -165,14 +165,15 @@ def __get_events(self, wait: Union[bool, float] =
> False) -> None:
> """
>
> # Check for new events regardless and pull them into the cache:
> - self.__sock.setblocking(False)
> try:
> + self.__sock.setblocking(False)
This change is not required. The idiom is:
do stuff
try:
something
finally:
undo stuff
If do stuff failed, there is no need to undo it.
socket.setblocking() should not fail with EAGAIN, so it
does not need to be inside the try block.
> self.__json_read()
> except OSError as err:
> - if err.errno == errno.EAGAIN:
> - # No data available
> - pass
> - self.__sock.setblocking(True)
> + # EAGAIN: No data available; not critical
> + if err.errno != errno.EAGAIN:
> + raise
In python 3 this can be simplified to:
try:
self.__json_read()
except BlockingIOError:
pass
https://docs.python.org/3.6/library/exceptions.html#BlockingIOError
> + finally:
> + self.__sock.setblocking(True)
>
> # Wait for new events, if needed.
> # if wait is 0.0, this means "no wait" and is also implicitly false.
> --
> 2.26.2
Nir