From: Eduardo Habkost <ehabkost@redhat.com>
To: "Lukáš Doktor" <ldoktor@redhat.com>
Cc: qemu-devel@nongnu.org, famz@redhat.com, apahim@redhat.com,
mreitz@redhat.com, f4bug@amsat.org, armbru@redhat.com
Subject: Re: [Qemu-devel] [PATCH v2 05/10] qemu.py: Use custom exceptions rather than Exception
Date: Tue, 25 Jul 2017 13:06:39 -0300 [thread overview]
Message-ID: <20170725160639.GO2757@localhost.localdomain> (raw)
In-Reply-To: <20170725150951.16038-6-ldoktor@redhat.com>
On Tue, Jul 25, 2017 at 05:09:46PM +0200, Lukáš Doktor wrote:
> The naked Exception should not be widely used. It makes sense to be a
> bit more specific and use better-suited custom exceptions. As a benefit
> we can store the full reply in the exception in case someone needs it
> when catching the exception.
>
> Signed-off-by: Lukáš Doktor <ldoktor@redhat.com>
> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> scripts/qemu.py | 17 +++++++++++++++--
> 1 file changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/scripts/qemu.py b/scripts/qemu.py
> index 5948e19..e6df54c 100644
> --- a/scripts/qemu.py
> +++ b/scripts/qemu.py
> @@ -19,6 +19,19 @@ import subprocess
> import qmp.qmp
>
>
> +class MonitorResponseError(qmp.qmp.QMPError):
> + '''
> + Represents erroneous QMP monitor reply
> + '''
> + def __init__(self, reply):
> + try:
> + desc = reply["error"]["desc"]
> + except KeyError:
> + desc = reply
^^^ (*)
> + super(MonitorResponseError, self).__init__(repr(desc))
This will end up calling Exception.__init__. I previously
suggested repr(desc) above(*) because I didn't know what happened
when the Exception.__init__ argument is not a string.
I couldn't find any documentation on the right argument types for
Exception.__init__. The examples in the Python documentation[1]
don't call Exception.__init__ at all: they simply implement
__str__().
However, based on my testing and on the BaseException
documentation[2], I believe repr() isn't really necessary:
"If str() or unicode() is called on an instance of this class,
the representation of the argument(s) to the instance are
returned, or the empty string when there were no arguments."
So your previous version was good, already.
But maybe we could do this instead, to make the constructor as
simple as possible:
class MonitorResponseError(qmp.qmp.QMPError):
def __init__(self, reply):
self.reply = reply
def __str__(self):
return self.reply.get('error', {}).get('desc', repr(self.reply))
[1] https://docs.python.org/2/tutorial/errors.html#user-defined-exceptions
[2] https://docs.python.org/2/library/exceptions.html#exceptions.BaseException
> + self.reply = reply
> +
> +
> class QEMUMachine(object):
> '''A QEMU VM'''
>
> @@ -197,9 +210,9 @@ class QEMUMachine(object):
> '''
> reply = self.qmp(cmd, conv_keys, **args)
> if reply is None:
> - raise Exception("Monitor is closed")
> + raise qmp.qmp.QMPError("Monitor is closed")
> if "error" in reply:
> - raise Exception(reply["error"]["desc"])
> + raise MonitorResponseError(reply)
> return reply["return"]
>
> def get_qmp_event(self, wait=False):
> --
> 2.9.4
>
--
Eduardo
next prev parent reply other threads:[~2017-07-25 16:16 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-25 15:09 [Qemu-devel] [PATCH v2 00/10] qemu.py: Pylint/style fixes Lukáš Doktor
2017-07-25 15:09 ` [Qemu-devel] [PATCH v2 01/10] " Lukáš Doktor
2017-07-25 15:09 ` [Qemu-devel] [PATCH v2 02/10] qemu|qtest: Avoid dangerous arguments Lukáš Doktor
2017-07-25 17:14 ` John Snow
2017-07-25 15:09 ` [Qemu-devel] [PATCH v2 03/10] qemu.py: Use iteritems rather than keys() Lukáš Doktor
2017-07-25 15:09 ` [Qemu-devel] [PATCH v2 04/10] qemu.py: Simplify QMP key-conversion Lukáš Doktor
2017-07-25 15:09 ` [Qemu-devel] [PATCH v2 05/10] qemu.py: Use custom exceptions rather than Exception Lukáš Doktor
2017-07-25 16:06 ` Eduardo Habkost [this message]
2017-07-26 4:39 ` Lukáš Doktor
2017-07-26 13:00 ` Eduardo Habkost
2017-07-25 15:09 ` [Qemu-devel] [PATCH v2 06/10] qmp.py: Couple of pylint/style fixes Lukáš Doktor
2017-07-25 15:18 ` Philippe Mathieu-Daudé
2017-07-25 15:09 ` [Qemu-devel] [PATCH v2 07/10] qmp.py: Use object-based class for QEMUMonitorProtocol Lukáš Doktor
2017-07-25 15:09 ` [Qemu-devel] [PATCH v2 08/10] qmp.py: Avoid "has_key" usage Lukáš Doktor
2017-07-25 15:09 ` [Qemu-devel] [PATCH v2 09/10] qmp.py: Avoid overriding a builtin object Lukáš Doktor
2017-07-25 19:34 ` Eduardo Habkost
2017-07-26 4:46 ` Lukáš Doktor
2017-07-26 13:01 ` Eduardo Habkost
2017-07-25 15:09 ` [Qemu-devel] [PATCH v2 10/10] qtest.py: Few pylint/style fixes Lukáš Doktor
2017-07-25 17:19 ` John Snow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170725160639.GO2757@localhost.localdomain \
--to=ehabkost@redhat.com \
--cc=apahim@redhat.com \
--cc=armbru@redhat.com \
--cc=f4bug@amsat.org \
--cc=famz@redhat.com \
--cc=ldoktor@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).