[Spice-devel] [PATCH v2 18/24] Catch all std::exception derivatives (including std::bad_alloc, not a std::bad_alloc)
Christophe de Dinechin
christophe.de.dinechin at gmail.com
Thu Feb 22 09:35:14 UTC 2018
> 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.
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…
>
> Lukas
>
>> + ret = EXIT_FAILURE;
>> + }
>>
>> closelog();
>> return ret;
More information about the Spice-devel
mailing list