[Spice-devel] [PATCH spice-streaming-agent] Detect and handle exception creating capture engine

Frediano Ziglio fziglio at redhat.com
Tue Feb 20 17:05:42 UTC 2018


> 
> > On 20 Feb 2018, at 17:49, Frediano Ziglio <fziglio at redhat.com> wrote:
> > 
> > Currently exception from a plugin are not handled when creating
> > a capture engine.
> > Capture the exception and try to use another plugin instead of
> > bailing out.
> > This was tested with an experimental GStreamer plugin.
> > 
> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > ---
> > src/concrete-agent.cpp | 9 ++++++++-
> > 1 file changed, 8 insertions(+), 1 deletion(-)
> > 
> > diff --git a/src/concrete-agent.cpp b/src/concrete-agent.cpp
> > index 0720782..112ef93 100644
> > --- a/src/concrete-agent.cpp
> > +++ b/src/concrete-agent.cpp
> > @@ -113,7 +113,14 @@ FrameCapture *ConcreteAgent::GetBestFrameCapture(const
> > std::set<SpiceVideoCodecT
> >         // check client supports the codec
> >         if (codecs.find(plugin.second->VideoCodecType()) == codecs.end())
> >             continue;
> > -        FrameCapture *capture = plugin.second->CreateCapture();
> > +
> > +        FrameCapture *capture;
> > +        try {
> > +            capture = plugin.second->CreateCapture();
> > +        } catch (const std::runtime_error &err) {
> > +            syslog(LOG_ERR, "Error getting capture engine: %s",
> > err.what());
> > +            continue;
> > +        }
> 
> I noticed that you usually capture std::runtime_error. Why not
> std::exception? You still get “what”, and that lets you catch bad_alloc too.
> 
> >         if (capture) {
> >             return capture;
> >         }

Lot of classes which inherit from std::exception are not normal program
exceptions but hard cases (beside std::logic_error) which are hard to
deal with so I prefer to limit to std::runtime_error.

Frediano


More information about the Spice-devel mailing list