
On Tue, Aug 19, 2008 at 10:31:34AM +0100, Daniel P. Berrange wrote:
Most of the libvirt python API bindings use code snippet like this when raising an exception:
if ret is None:raise libvirtError('virConnectOpen() failed')
THis sets the message associated with the exception to
"virConnectOpen() failed"
This contains essentially zero useful information - you can see that it was virConnectOpen which failed from the stack trace.
Now the libvirt error object has a real message, such as
"authentication failed"
Or
"unable to connect to '/var/run/libvirt/libvirt-sock': Connection refused"
This patch makes sure we extract this real error message and use it to set the message associated with the exception object. This is one step in getting better error reporting for virt-install/virt-manager, which is particularly needed for remote connections
This patch was flawed - it missed out the error message info when passed in a domain/network/volume/pool instead of a connection object. Here is an updated patch which addresses that Daniel Index: python/libvir.py =================================================================== RCS file: /data/cvs/libvirt/python/libvir.py,v retrieving revision 1.9 diff -u -r1.9 libvir.py --- python/libvir.py 11 Jun 2008 07:49:01 -0000 1.9 +++ python/libvir.py 21 Aug 2008 10:58:53 -0000 @@ -15,8 +15,7 @@ # The root of all libvirt errors. class libvirtError(Exception): - def __init__(self, msg, conn=None, dom=None, net=None, pool=None, vol=None): - Exception.__init__(self, msg) + def __init__(self, defmsg, conn=None, dom=None, net=None, pool=None, vol=None): if dom is not None: conn = dom._conn @@ -28,9 +27,17 @@ conn = vol._conn if conn is None: - self.err = virGetLastError() + err = virGetLastError() + else: + err = conn.virConnGetLastError() + if err is None: + msg = defmsg else: - self.err = conn.virConnGetLastError() + msg = err[2] + + Exception.__init__(self, msg) + + self.err = err def get_error_code(self): if self.err is None: @@ -77,12 +84,6 @@ return None return self.err[8] - def __str__(self): - if self.get_error_message() is None: - return Exception.__str__(self) - else: - return Exception.__str__(self) + " " + self.get_error_message() - # # register the libvirt global error handler # -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|