From: John Snow <jsnow@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Eduardo Habkost <ehabkost@redhat.com>,
Michael Roth <michael.roth@amd.com>,
Michael Roth <mdroth@linux.vnet.ibm.com>,
qemu-devel@nongnu.org, Cleber Rosa <crosa@redhat.com>
Subject: Re: [PATCH v2 1/8] qapi/error: Repurpose QAPIError as a generic exception base class
Date: Fri, 16 Apr 2021 13:59:57 -0400 [thread overview]
Message-ID: <545d16db-1251-2153-b36f-14ebeb3b07cb@redhat.com> (raw)
In-Reply-To: <87im4mrchp.fsf@dusky.pond.sub.org>
On 4/16/21 2:04 AM, Markus Armbruster wrote:
> John Snow <jsnow@redhat.com> writes:
>
>> On 4/15/21 2:44 AM, Markus Armbruster wrote:
>>> John Snow <jsnow@redhat.com> writes:
>>>
>>>> Rename QAPIError to QAPISourceError, and then create a new QAPIError
>>>> class that serves as the basis for all of our other custom exceptions.
>>>
>>> Isn't the existing QAPIError such a base class already? Peeking
>>> ahead... aha, your new base class is abstract. Can you explain why we
>>> that's useful?
>>>
>>
>> Sure. The existing QAPIError class assumes that it's an error that has a
>> source location, but not all errors will. The idea is that an abstract
>> error class can be used as the ancestor for all other errors in a
>> type-safe way, such that:
>>
>> try:
>> qapi.something_or_other()
>> except QAPIError as err:
>> err.some_sort_of_method()
>>
>> (1) This is a type-safe construct, and
>> (2) This is sufficient to catch all errors that originate from within
>> the library, regardless of their exact type.
>>
>> Primarily, it's a ploy to get the SourceInfo stuff out of the
>> common/root exception for type safety reasons.
>>
>> (Later in the series, you'll see there's a few places where we try to
>> fake SourceInfo stuff in order to use QAPIError, by shuffling this
>> around, we allow ourselves to raise exceptions that don't need this
>> hackery.)
>
> I think you're conflating a real issue with a non-issue.
>
> The real issue: you want to get rid of fake QAPISourceInfo. This isn't
> terribly important, but small cleanups count, too. I can't see the "few
> places where we try to fake" in this series, though. Is it in a later
> part, or am I just blind?
>
I was mistaken, we don't fudge it except in one place, and that gets
fixed in the parser.py series, not this one.
What I really wanted: I wanted to make the base error object something
that doesn't have an info field at all, fake or not, so that it can be
ubiquitously re-used as an abstract, common ancestor.
A separate issue: Sometimes, we want to raise errors that *usually* have
source information, but *might* not sometimes, because of reasons.
So, I guess I don't really have a particularly strong technical
justification for this anymore, beyond "following a pattern I see and
use in other projects":
https://docs.python.org/3/tutorial/errors.html#user-defined-exceptions
"When creating a module that can raise several distinct errors, a common
practice is to create a base class for exceptions defined by that
module, and subclass that to create specific exception classes for
different error conditions"
Which QAPIError does not violate, though I usually see this pattern used
with a tabula rasa class to maximize re-use.
Some of my parser.py drafts that attempted to split out QAPIDoc using
the Exception-chaining method we discussed on call winds up using this
abstract class more directly, but we aren't sure we want that yet. (Or,
we're fairly sure we want to try to delay thinking about it. I am still
working on re-cleaning part 5.)
> The non-issue: wanting a common base class. Yes, we want one, but we
> already got one: QAPIError.
>
> I think the commit message should explain the real issue more clearly,
> without confusing readers with the non-issue.
>
> Makes sense?
>
I'll spend a few minutes and see if dropping this patch doesn't deeply
disturb later patches (or if it can be shuffled backwards to a point
where it makes more sense contextually).
I genuinely can't remember if it's going to wrench something else up
later or not right now, though; and I still haven't finished rebasing
part 5 so I don't have a "finished" product repository to test on anymore.
--js
next prev parent reply other threads:[~2021-04-16 18:03 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-30 17:18 [PATCH v2 0/8] qapi: static typing conversion, pt4 John Snow
2021-03-30 17:18 ` [PATCH v2 1/8] qapi/error: Repurpose QAPIError as a generic exception base class John Snow
2021-04-15 6:44 ` Markus Armbruster
2021-04-15 15:28 ` John Snow
2021-04-16 6:04 ` Markus Armbruster
2021-04-16 17:59 ` John Snow [this message]
2021-03-30 17:18 ` [PATCH v2 2/8] qapi/error: Use Python3-style super() John Snow
2021-04-15 6:47 ` Markus Armbruster
2021-03-30 17:18 ` [PATCH v2 3/8] qapi/error: Make QAPISourceError 'col' parameter optional John Snow
2021-03-30 17:18 ` [PATCH v2 4/8] qapi/error: Change assertion John Snow
2021-04-08 15:31 ` John Snow
2021-04-15 7:00 ` Markus Armbruster
2021-04-15 15:44 ` John Snow
2021-04-16 6:17 ` Markus Armbruster
2021-04-16 18:24 ` John Snow
2021-04-17 12:10 ` Markus Armbruster
2021-03-30 17:18 ` [PATCH v2 5/8] qapi/error.py: move QAPIParseError to parser.py John Snow
2021-03-30 17:18 ` [PATCH v2 6/8] qapi/error.py: enable pylint checks John Snow
2021-03-30 17:18 ` [PATCH v2 7/8] qapi/error: Add type hints John Snow
2021-04-15 7:15 ` Markus Armbruster
2021-04-15 15:52 ` John Snow
2021-03-30 17:18 ` [PATCH v2 8/8] qapi/error.py: enable mypy checks 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=545d16db-1251-2153-b36f-14ebeb3b07cb@redhat.com \
--to=jsnow@redhat.com \
--cc=armbru@redhat.com \
--cc=crosa@redhat.com \
--cc=ehabkost@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=michael.roth@amd.com \
--cc=peter.maydell@linaro.org \
--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).