[Spice-devel] [PATCH v2 18/24] Catch all std::exception derivatives (including std::bad_alloc, not a std::bad_alloc)

Lukáš Hrázký lhrazky at redhat.com
Thu Feb 22 09:51:25 UTC 2018


On Thu, 2018-02-22 at 10:35 +0100, Christophe de Dinechin wrote:
> > On Feb 22, 2018, at 10:23 AM, Lukáš Hrázký <lhrazky at redhat.com> wrote:
> > 
> > On Wed, 2018-02-21 at 18:46 +0100, Christophe de Dinechin wrote:
> > > From: Christophe de Dinechin <dinechin at redhat.com>
> > > 
> > > I also added a catch-all clause for double plus extra safety
> > > 
> > > Signed-off-by: Christophe de Dinechin <dinechin at redhat.com>
> > > ---
> > > src/spice-streaming-agent.cpp | 6 +++++-
> > > 1 file changed, 5 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp
> > > index f9d8855..26fa910 100644
> > > --- a/src/spice-streaming-agent.cpp
> > > +++ b/src/spice-streaming-agent.cpp
> > > @@ -623,10 +623,14 @@ int main(int argc, char* argv[])
> > >         FrameLog frame_log(log_filename, log_binary);
> > >         agent.CaptureLoop(streamfd, frame_log);
> > >     }
> > > -    catch (std::runtime_error &err) {
> > > +    catch (std::exception &err) {
> > >         syslog(LOG_ERR, "%s\n", err.what());
> > >         ret = EXIT_FAILURE;
> > >     }
> > > +    catch (...) {
> > > +        syslog(LOG_ERR, "Unexpected exception caught (probably thronw by plugin init");
> > 
> > Typo.
> 
> Two, actually…
> 
> > Is it still technically an exception if it is not derived from
> > std::exception? I wouldn't call it so, it can be std::string.
> 
> Well, I think it’s still called an exception even if it’s not std::exception, much like we talk about “functions” or “classes”. What matters is that it is thrown.
> 
> > 
> > I don't like the speculation in the error message.
> 
> Hmmm, you are right. What was I thinking ;-) Clearly, given the two typos and the nonsensical message, I was rushing this a bit too much.
> 
> 
> > What we should
> > really do is catch exceptions from plugin init directly and log it
> > accordingly (and also not necessarily abort the agent, let it run
> > without the faulty plugin).
> 
> Well, I had a discussion with Frediano on this. He pointed out that things that do not derive from runtime_error are often hard to recover from. So unless we know how to recover, I think it’s a good thing to pop them back at the top and show a message.

I would be interested in the reasoning. Are we still talking about
plugin init? For example if it throws 'int'? I mean it could have done
all sorts of ugly things and no cleanup before throwing the 'int', but
it could have done all those things and _not_ throw even that 'int' too
:) Or do you mean something else?

> We could debate whether a catch-all is a good things.
> 
> - Plus side: it lets us send a message to the syslog instead of stderr. Does that matter?
> - Minus side: the message is not as clear as, say "terminate called after throwing an instance of ‘int’”, and no abort, so no core dump.
> 
> Maybe it’s not a good idea after all…

That sure is a dilemma I don't have a good answer to...

> > 
> > Lukas
> > 
> > > +        ret = EXIT_FAILURE;
> > > +    }
> > > 
> > >     closelog();
> > >     return ret;
> 
> 


More information about the Spice-devel mailing list