[Libguestfs] [PATCH libnbd v3] python: Raise a custom exception containing error string and errno.

Richard W.M. Jones rjones at redhat.com
Fri Jun 28 19:45:22 UTC 2019


On Fri, Jun 28, 2019 at 02:43:48PM -0500, Eric Blake wrote:
> On 6/28/19 2:17 PM, Richard W.M. Jones wrote:
> 
> >>
> >> Looks good to me now!  Thanks for figuring this out while I was
> >> struggling with reading lots of documentation on C bindings.
> >>
> >> ACK
> > 
> > I pushed it, but there may be a few issues still:
> > 
> > - Still no error checking in raise_exception().  We're on an error
> >   path already here so it's hard to do anything useful, although
> >   perhaps we should not segfault.
> 
> Yeah, avoiding the segfault is still worthwhile - but our lack of
> PyFOO_BAR() error checking is more pervasive than just in
> raise_exception(), so a patch to audit all of our generated code will
> pick that up along with the rest.
> 
> > 
> > - The .errno attribute returns a (Python module) errno value, not a
> >   number, so the number is effectively lost, should that really be an
> >   issue.
> 
> Maybe we want two fields, both .errno (string name, or None if Python
> errno.errorcode couldn't map it to a name), and .errnum (raw numeric
> value, accessible no matter what).
> 
> Maybe as simple as this (or with one further tweak to __str__ to at
> least output .errnum when .errno is None):
> 
> diff --git i/generator/generator w/generator/generator
> index 7c2fb59..9192988 100755
> --- i/generator/generator
> +++ w/generator/generator
> @@ -3944,11 +3944,14 @@ from libnbdmod import Error
>  Error.__doc__ = '''
>  Exception thrown when the underlying libnbd call fails.
> 
> -This exception has two properties to query the error.  Use
> +This exception has three properties to query the error.  Use
>  the .string property to return a printable string containing
> -the error message.  Use the .errno property to return a
> -Python errno (which may be None in some cases if the error
> -did not correspond to a system call failure).
> +the error message.  Use the .errnum property for the associated
> +numeric error value (which may be 0 if the error did not
> +correspond to a system call failure), or the .errno property to
> +return a string containing the Python errno name if one is known
> +(which may be None if the numeric value does not correspond to
> +a known errno name).
>  '''
> 
>  Error.string = property (lambda self: self.args[0])
> @@ -3961,6 +3964,8 @@ def _errno (self):
>          return None
>  Error.errno = property (_errno)
> 
> +Error.errnum = property (lambda self: self.args[1])
> +
>  def _str (self):
>      if self.errno:
>          return (\"%%s (%%s)\" %% (self.string, self.errno))
> 

Yes this works, ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW




More information about the Libguestfs mailing list