commit aa668cae87fb1704bb7362b066e63a64bdb32210
Author: W. David Ashley <w.david.ashley(a)gmail.com>
Date: Tue Aug 4 09:45:53 2015 -0500
Error handling chapter
- moved text to examples 1-4
- corrected spelling errors
en-US/Error_Handling.xml | 223 +------------------------------
en-US/extras/ErrorHandling-Example-1.py | 59 ++++++++
en-US/extras/ErrorHandling-Example-2.py | 93 +++++++++++++
en-US/extras/ErrorHandling-Example-3.py | 61 +++++++++
en-US/extras/ErrorHandling-Example-4.py | 3 +
5 files changed, 223 insertions(+), 216 deletions(-)
---
diff --git a/en-US/Error_Handling.xml b/en-US/Error_Handling.xml
index 4f8d5d8..79259b3 100644
--- a/en-US/Error_Handling.xml
+++ b/en-US/Error_Handling.xml
@@ -16,65 +16,10 @@
that can be subclassed to add additional functionality when raising a libvirt
exception.
A partial definition of the <literal>libvirtError</literal> class
definition looks like:
</para>
- <programlisting language="Python"><![CDATA[class
libvirtError(Exception):
- def __init__(self, defmsg, conn=None, dom=None, net=None, pool=None, vol=None):
-
- # Never call virConnGetLastError().
- # virGetLastError() is now thread local
- err = virGetLastError()
- if err is None:
- msg = defmsg
- else:
- msg = err[2]
-
- Exception.__init__(self, msg)
-
- self.err = err
-
- def get_error_code(self):
- if self.err is None:
- return None
- return self.err[0]
-
- def get_error_domain(self):
- if self.err is None:
- return None
- return self.err[1]
-
- def get_error_message(self):
- if self.err is None:
- return None
- return self.err[2]
-
- def get_error_level(self):
- if self.err is None:
- return None
- return self.err[3]
-
- def get_str1(self):
- if self.err is None:
- return None
- return self.err[4]
-
- def get_str2(self):
- if self.err is None:
- return None
- return self.err[5]
-
- def get_str3(self):
- if self.err is None:
- return None
- return self.err[6]
-
- def get_int1(self):
- if self.err is None:
- return None
- return self.err[7]
-
- def get_int2(self):
- if self.err is None:
- return None
- return self.err[8]]]></programlisting>
+ <example>
+ <title>Libvirt module libvirtError class definition</title>
+ <programlisting language="Python"><xi:include
href="extras/ErrorHandling-Example-1.py" parse="text"
xmlns:xi="http://www.w3.org/2001/XInclude" /></programlisting>
+ </example>
<para>
There are a few things to note about this definition. The first is that you can
instantiate this class
by using the Python <literal>raise</literal> statement. Actually this
is not of much use unless
@@ -88,99 +33,7 @@
Some of the higher numbered entries from this list my not be available in your
Python
libvirt module.
</para>
- <programlisting language="Python"><![CDATA[VIR_ERR_OK = 0
-VIR_ERR_INTERNAL_ERROR = 1 # internal error
-VIR_ERR_NO_MEMORY = 2 # memory allocation failure
-VIR_ERR_NO_SUPPORT = 3 # no support for this function
-VIR_ERR_UNKNOWN_HOST = 4 # could not resolve hostname
-VIR_ERR_NO_CONNECT = 5 # can not connect to hypervisor
-VIR_ERR_INVALID_CONN = 6 # invalid connection object
-VIR_ERR_INVALID_DOMAIN = 7 # invalid domain object
-VIR_ERR_INVALID_ARG = 8 # invalid function argument
-VIR_ERR_OPERATION_FAILED = 9 # a command to hypervisor failed
-VIR_ERR_GET_FAILED = 10 # a HTTP GET command to failed
-VIR_ERR_POST_FAILED = 11 # a HTTP POST command to failed
-VIR_ERR_HTTP_ERROR = 12 # unexpected HTTP error code
-VIR_ERR_SEXPR_SERIAL = 13 # failure to serialize an S-Expr
-VIR_ERR_NO_XEN = 14 # could not open Xen hypervisor control
-VIR_ERR_XEN_CALL = 15 # failure doing an hypervisor call
-VIR_ERR_OS_TYPE = 16 # unknown OS type
-VIR_ERR_NO_KERNEL = 17 # missing kernel information
-VIR_ERR_NO_ROOT = 18 # missing root device information
-VIR_ERR_NO_SOURCE = 19 # missing source device information
-VIR_ERR_NO_TARGET = 20 # missing target device information
-VIR_ERR_NO_NAME = 21 # missing domain name information
-VIR_ERR_NO_OS = 22 # missing domain OS information
-VIR_ERR_NO_DEVICE = 23 # missing domain devices information
-VIR_ERR_NO_XENSTORE = 24 # could not open Xen Store control
-VIR_ERR_DRIVER_FULL = 25 # too many drivers registered
-VIR_ERR_CALL_FAILED = 26 # not supported by the drivers (DEPRECATED)
-VIR_ERR_XML_ERROR = 27 # an XML description is not well formed or broken
-VIR_ERR_DOM_EXIST = 28 # the domain already exist
-VIR_ERR_OPERATION_DENIED = 29 # operation forbidden on read-only connections
-VIR_ERR_OPEN_FAILED = 30 # failed to open a conf file
-VIR_ERR_READ_FAILED = 31 # failed to read a conf file
-VIR_ERR_PARSE_FAILED = 32 # failed to parse a conf file
-VIR_ERR_CONF_SYNTAX = 33 # failed to parse the syntax of a conf file
-VIR_ERR_WRITE_FAILED = 34 # failed to write a conf file
-VIR_ERR_XML_DETAIL = 35 # detail of an XML error
-VIR_ERR_INVALID_NETWORK = 36 # invalid network object
-VIR_ERR_NETWORK_EXIST = 37 # the network already exist
-VIR_ERR_SYSTEM_ERROR = 38 # general system call failure
-VIR_ERR_RPC = 39 # some sort of RPC error
-VIR_ERR_GNUTLS_ERROR = 40 # error from a GNUTLS call
-VIR_WAR_NO_NETWORK = 41 # failed to start network
-VIR_ERR_NO_DOMAIN = 42 # domain not found or unexpectedly disappeared
-VIR_ERR_NO_NETWORK = 43 # network not found
-VIR_ERR_INVALID_MAC = 44 # invalid MAC address
-VIR_ERR_AUTH_FAILED = 45 # authentication failed
-VIR_ERR_INVALID_STORAGE_POOL = 46 # invalid storage pool object
-VIR_ERR_INVALID_STORAGE_VOL = 47 # invalid storage vol object
-VIR_WAR_NO_STORAGE = 48 # failed to start storage
-VIR_ERR_NO_STORAGE_POOL = 49 # storage pool not found
-VIR_ERR_NO_STORAGE_VOL = 50 # storage pool not found
-VIR_WAR_NO_NODE = 51 # failed to start node driver
-VIR_ERR_INVALID_NODE_DEVICE = 52 # invalid node device object
-VIR_ERR_NO_NODE_DEVICE = 53 # node device not found
-VIR_ERR_NO_SECURITY_MODEL = 54 # security model not found
-VIR_ERR_OPERATION_INVALID = 55 # operation is not applicable at this time
-VIR_WAR_NO_INTERFACE = 56 # failed to start interface driver
-VIR_ERR_NO_INTERFACE = 57 # interface driver not running
-VIR_ERR_INVALID_INTERFACE = 58 # invalid interface object
-VIR_ERR_MULTIPLE_INTERFACES = 59 # more than one matching interface found
-VIR_WAR_NO_NWFILTER = 60 # failed to start nwfilter driver
-VIR_ERR_INVALID_NWFILTER = 61 # invalid nwfilter object
-VIR_ERR_NO_NWFILTER = 62 # nw filter pool not found
-VIR_ERR_BUILD_FIREWALL = 63 # nw filter pool not found
-VIR_WAR_NO_SECRET = 64 # failed to start secret storage
-VIR_ERR_INVALID_SECRET = 65 # invalid secret
-VIR_ERR_NO_SECRET = 66 # secret not found
-VIR_ERR_CONFIG_UNSUPPORTED = 67 # unsupported configuration construct
-VIR_ERR_OPERATION_TIMEOUT = 68 # timeout occurred during operation
-VIR_ERR_MIGRATE_PERSIST_FAILED = 69 # a migration worked, but making the VM persist on
the dest host failed
-VIR_ERR_HOOK_SCRIPT_FAILED = 70 # a synchronous hook script failed
-VIR_ERR_INVALID_DOMAIN_SNAPSHOT = 71 # invalid domain snapshot
-VIR_ERR_NO_DOMAIN_SNAPSHOT = 72 # domain snapshot was not found
-VIR_ERR_INVALID_STREAM = 73 # invalid i/o stream
-VIR_ERR_ARGUMENT_UNSUPPORTED = 74 # an argument was unsupported
-VIR_ERR_STORAGE_PROBE_FAILED = 75 # a storage probe failed
-VIR_ERR_STORAGE_POOL_BUILT = 76
-VIR_ERR_SNAPSHOT_REVERT_RISKY = 77
-VIR_ERR_OPERATION_ABORTED = 78 # the operation was aborted
-VIR_ERR_AUTH_CANCELLED = 79
-VIR_ERR_NO_DOMAIN_METADATA = 80 # no domain metadata was found
-VIR_ERR_MIGRATE_UNSAFE = 81
-VIR_ERR_OVERFLOW = 82 # an overflow situation was detected
-VIR_ERR_BLOCK_COPY_ACTIVE = 83
-VIR_ERR_OPERATION_UNSUPPORTED = 84 # the operation was unsupported
-VIR_ERR_SSH = 85 # an ssh error was detected
-VIR_ERR_AGENT_UNRESPONSIVE = 86 # an agent timeout was detected
-VIR_ERR_RESOURCE_BUSY = 87
-VIR_ERR_ACCESS_DENIED = 88
-VIR_ERR_DBUS_SERVICE = 89
-VIR_ERR_STORAGE_VOL_EXIST = 90
-VIR_ERR_CPU_INCOMPATIBLE = 91
-VIR_ERR_XML_INVALID_SCHEMA = 92]]></programlisting>
+ <programlisting language="Python"><xi:include
href="extras/ErrorHandling-Example-2.py" parse="text"
xmlns:xi="http://www.w3.org/2001/XInclude" /></programlisting>
<para>
The method <literal>get_error_domain</literal> is named that for
legacy
reasons, but really represents which part of libvirt generated the
@@ -188,67 +41,7 @@ VIR_ERR_XML_INVALID_SCHEMA = 92]]></programlisting>
Some of the higher numbered entries from this list my not be available in your
Python
libvirt module. The full list is:
</para>
- <programlisting language="Python"><![CDATA[VIR_FROM_NONE = 0
-VIR_FROM_XEN = 1 # Error at Xen hypervisor layer
-VIR_FROM_XEND = 2 # Error at connection with xend daemon
-VIR_FROM_XENSTORE = 3 # Error at connection with xen store
-VIR_FROM_SEXPR = 4 # Error in the S-Expression code
-VIR_FROM_XML = 5 # Error in the XML code
-VIR_FROM_DOM = 6 # Error when operating on a domain
-VIR_FROM_RPC = 7 # Error in the XML-RPC code
-VIR_FROM_PROXY = 8 # Error in the proxy code
-VIR_FROM_CONF = 9 # Error in the configuration file handling
-VIR_FROM_QEMU = 10 # Error at the QEMU daemon
-VIR_FROM_NET = 11 # Error when operating on a network
-VIR_FROM_TEST = 12 # Error from test driver
-VIR_FROM_REMOTE = 13 # Error from remote driver
-VIR_FROM_OPENVZ = 14 # Error from OpenVZ driver
-VIR_FROM_XENXM = 15 # Error at Xen XM layer
-VIR_FROM_STATS_LINUX = 16 # Error in the Linux Stats code
-VIR_FROM_LXC = 17 # Error from Linux Container driver
-VIR_FROM_STORAGE = 18 # Error from storage driver
-VIR_FROM_NETWORK = 19 # Error from network config
-VIR_FROM_DOMAIN = 20 # Error from domain config
-VIR_FROM_UML = 21 # Error at the UML driver
-VIR_FROM_NODEDEV = 22 # Error from node device monitor
-VIR_FROM_XEN_INOTIFY = 23 # Error from xen inotify layer
-VIR_FROM_SECURITY = 24 # Error from security framework
-VIR_FROM_VBOX = 25 # Error from VirtualBox driver
-VIR_FROM_INTERFACE = 26 # Error when operating on an interface
-VIR_FROM_ONE = 27 # Error from OpenNebula driver
-VIR_FROM_ESX = 28 # Error from ESX driver
-VIR_FROM_PHYP = 29 # Error from IBM power hypervisor
-VIR_FROM_SECRET = 30 # Error from secret storage
-VIR_FROM_CPU = 31 # Error from CPU driver
-VIR_FROM_XENAPI = 32 # Error from XenAPI
-VIR_FROM_NWFILTER = 33 # Error from network filter driver
-VIR_FROM_HOOK = 34 # Error from Synchronous hooks
-VIR_FROM_DOMAIN_SNAPSHOT = 35 # Error from domain snapshot
-VIR_FROM_AUDIT = 36
-VIR_FROM_SYSINFO = 37
-VIR_FROM_STREAMS = 38
-VIR_FROM_VMWARE = 39
-VIR_FROM_EVENT = 40
-VIR_FROM_LIBXL = 41
-VIR_FROM_LOCKING = 42
-VIR_FROM_HYPERV = 43
-VIR_FROM_CAPABILITIES = 44
-VIR_FROM_URI = 45
-VIR_FROM_AUTH = 46
-VIR_FROM_DBUS = 47
-VIR_FROM_PARALLELS = 48
-VIR_FROM_DEVICE = 49
-VIR_FROM_SSH = 50
-VIR_FROM_LOCKSPACE = 51
-VIR_FROM_INITCTL = 52
-VIR_FROM_IDENTITY = 53
-VIR_FROM_CGROUP = 54
-VIR_FROM_ACCESS = 55
-VIR_FROM_SYSTEMD = 56
-VIR_FROM_BHYVE = 57
-VIR_FROM_CRYPTO = 58
-VIR_FROM_FIREWALL = 59
-VIR_FROM_POLKIT = 60]]></programlisting>
+ <programlisting language="Python"><xi:include
href="extras/ErrorHandling-Example-3.py" parse="text"
xmlns:xi="http://www.w3.org/2001/XInclude" /></programlisting>
<para>
The method <literal>get_error_message</literal> is a human-readable
string
describing the error.
@@ -258,9 +51,7 @@ VIR_FROM_POLKIT = 60]]></programlisting>
error. This is one of the data definition from the Python libvirt module.
The full list of levels is:
</para>
- <programlisting language="Python"><![CDATA[VIR_ERR_NONE = 0
-VIR_ERR_WARNING = 1 # A simple warning
-VIR_ERR_ERROR = 2 # An error]]></programlisting>
+ <programlisting language="Python"><xi:include
href="extras/ErrorHandling-Example-4.py" parse="text"
xmlns:xi="http://www.w3.org/2001/XInclude" /></programlisting>
<para>
The method <literal>get_error_str1</literal> gives extra human
readable
information.
diff --git a/en-US/extras/ErrorHandling-Example-1.py
b/en-US/extras/ErrorHandling-Example-1.py
new file mode 100644
index 0000000..b94d3fd
--- /dev/null
+++ b/en-US/extras/ErrorHandling-Example-1.py
@@ -0,0 +1,59 @@
+class libvirtError(exceptions.Exception)
+ def __init__(self, defmsg, conn=None, dom=None, net=None, pool=None, vol=None):
+
+ # Never call virGetLastError().
+ # virGetLastError() is now thread local
+ err = virGetLastError()
+ if err is None:
+ msg = defmsg
+ else:
+ msg = err[2]
+
+ Exception.__init__(self, msg)
+
+ self.err = err
+
+ def get_error_code(self):
+ if self.err is None:
+ return None
+ return self.err[0]
+
+ def get_error_domain(self):
+ if self.err is None:
+ return None
+ return self.err[1]
+
+ def get_error_message(self):
+ if self.err is None:
+ return None
+ return self.err[2]
+
+ def get_error_level(self):
+ if self.err is None:
+ return None
+ return self.err[3]
+
+ def get_str1(self):
+ if self.err is None:
+ return None
+ return self.err[4]
+
+ def get_str2(self):
+ if self.err is None:
+ return None
+ return self.err[5]
+
+ def get_str3(self):
+ if self.err is None:
+ return None
+ return self.err[6]
+
+ def get_int1(self):
+ if self.err is None:
+ return None
+ return self.err[7]
+
+ def get_int2(self):
+ if self.err is None:
+ return None
+ return self.err[8]
diff --git a/en-US/extras/ErrorHandling-Example-2.py
b/en-US/extras/ErrorHandling-Example-2.py
new file mode 100644
index 0000000..4c7886f
--- /dev/null
+++ b/en-US/extras/ErrorHandling-Example-2.py
@@ -0,0 +1,93 @@
+VIR_ERR_OK = 0
+VIR_ERR_INTERNAL_ERROR = 1 # internal error
+VIR_ERR_NO_MEMORY = 2 # memory allocation failure
+VIR_ERR_NO_SUPPORT = 3 # no support for this function
+VIR_ERR_UNKNOWN_HOST = 4 # could not resolve hostname
+VIR_ERR_NO_CONNECT = 5 # can not connect to hypervisor
+VIR_ERR_INVALID_CONN = 6 # invalid connection object
+VIR_ERR_INVALID_DOMAIN = 7 # invalid domain object
+VIR_ERR_INVALID_ARG = 8 # invalid function argument
+VIR_ERR_OPERATION_FAILED = 9 # a command to hypervisor failed
+VIR_ERR_GET_FAILED = 10 # a HTTP GET command to failed
+VIR_ERR_POST_FAILED = 11 # a HTTP POST command to failed
+VIR_ERR_HTTP_ERROR = 12 # unexpected HTTP error code
+VIR_ERR_SEXPR_SERIAL = 13 # failure to serialize an S-Expr
+VIR_ERR_NO_XEN = 14 # could not open Xen hypervisor control
+VIR_ERR_XEN_CALL = 15 # failure doing an hypervisor call
+VIR_ERR_OS_TYPE = 16 # unknown OS type
+VIR_ERR_NO_KERNEL = 17 # missing kernel information
+VIR_ERR_NO_ROOT = 18 # missing root device information
+VIR_ERR_NO_SOURCE = 19 # missing source device information
+VIR_ERR_NO_TARGET = 20 # missing target device information
+VIR_ERR_NO_NAME = 21 # missing domain name information
+VIR_ERR_NO_OS = 22 # missing domain OS information
+VIR_ERR_NO_DEVICE = 23 # missing domain devices information
+VIR_ERR_NO_XENSTORE = 24 # could not open Xen Store control
+VIR_ERR_DRIVER_FULL = 25 # too many drivers registered
+VIR_ERR_CALL_FAILED = 26 # not supported by the drivers (DEPRECATED)
+VIR_ERR_XML_ERROR = 27 # an XML description is not well formed or broken
+VIR_ERR_DOM_EXIST = 28 # the domain already exist
+VIR_ERR_OPERATION_DENIED = 29 # operation forbidden on read-only connections
+VIR_ERR_OPEN_FAILED = 30 # failed to open a conf file
+VIR_ERR_READ_FAILED = 31 # failed to read a conf file
+VIR_ERR_PARSE_FAILED = 32 # failed to parse a conf file
+VIR_ERR_CONF_SYNTAX = 33 # failed to parse the syntax of a conf file
+VIR_ERR_WRITE_FAILED = 34 # failed to write a conf file
+VIR_ERR_XML_DETAIL = 35 # detail of an XML error
+VIR_ERR_INVALID_NETWORK = 36 # invalid network object
+VIR_ERR_NETWORK_EXIST = 37 # the network already exist
+VIR_ERR_SYSTEM_ERROR = 38 # general system call failure
+VIR_ERR_RPC = 39 # some sort of RPC error
+VIR_ERR_GNUTLS_ERROR = 40 # error from a GNUTLS call
+VIR_WAR_NO_NETWORK = 41 # failed to start network
+VIR_ERR_NO_DOMAIN = 42 # domain not found or unexpectedly disappeared
+VIR_ERR_NO_NETWORK = 43 # network not found
+VIR_ERR_INVALID_MAC = 44 # invalid MAC address
+VIR_ERR_AUTH_FAILED = 45 # authentication failed
+VIR_ERR_INVALID_STORAGE_POOL = 46 # invalid storage pool object
+VIR_ERR_INVALID_STORAGE_VOL = 47 # invalid storage vol object
+VIR_WAR_NO_STORAGE = 48 # failed to start storage
+VIR_ERR_NO_STORAGE_POOL = 49 # storage pool not found
+VIR_ERR_NO_STORAGE_VOL = 50 # storage pool not found
+VIR_WAR_NO_NODE = 51 # failed to start node driver
+VIR_ERR_INVALID_NODE_DEVICE = 52 # invalid node device object
+VIR_ERR_NO_NODE_DEVICE = 53 # node device not found
+VIR_ERR_NO_SECURITY_MODEL = 54 # security model not found
+VIR_ERR_OPERATION_INVALID = 55 # operation is not applicable at this time
+VIR_WAR_NO_INTERFACE = 56 # failed to start interface driver
+VIR_ERR_NO_INTERFACE = 57 # interface driver not running
+VIR_ERR_INVALID_INTERFACE = 58 # invalid interface object
+VIR_ERR_MULTIPLE_INTERFACES = 59 # more than one matching interface found
+VIR_WAR_NO_NWFILTER = 60 # failed to start nwfilter driver
+VIR_ERR_INVALID_NWFILTER = 61 # invalid nwfilter object
+VIR_ERR_NO_NWFILTER = 62 # nw filter pool not found
+VIR_ERR_BUILD_FIREWALL = 63 # nw filter pool not found
+VIR_WAR_NO_SECRET = 64 # failed to start secret storage
+VIR_ERR_INVALID_SECRET = 65 # invalid secret
+VIR_ERR_NO_SECRET = 66 # secret not found
+VIR_ERR_CONFIG_UNSUPPORTED = 67 # unsupported configuration construct
+VIR_ERR_OPERATION_TIMEOUT = 68 # timeout occurred during operation
+VIR_ERR_MIGRATE_PERSIST_FAILED = 69 # a migration worked, but making the VM persist on
the dest host failed
+VIR_ERR_HOOK_SCRIPT_FAILED = 70 # a synchronous hook script failed
+VIR_ERR_INVALID_DOMAIN_SNAPSHOT = 71 # invalid domain snapshot
+VIR_ERR_NO_DOMAIN_SNAPSHOT = 72 # domain snapshot was not found
+VIR_ERR_INVALID_STREAM = 73 # invalid i/o stream
+VIR_ERR_ARGUMENT_UNSUPPORTED = 74 # an argument was unsupported
+VIR_ERR_STORAGE_PROBE_FAILED = 75 # a storage probe failed
+VIR_ERR_STORAGE_POOL_BUILT = 76
+VIR_ERR_SNAPSHOT_REVERT_RISKY = 77
+VIR_ERR_OPERATION_ABORTED = 78 # the operation was aborted
+VIR_ERR_AUTH_CANCELLED = 79
+VIR_ERR_NO_DOMAIN_METADATA = 80 # no domain metadata was found
+VIR_ERR_MIGRATE_UNSAFE = 81
+VIR_ERR_OVERFLOW = 82 # an overflow situation was detected
+VIR_ERR_BLOCK_COPY_ACTIVE = 83
+VIR_ERR_OPERATION_UNSUPPORTED = 84 # the operation was unsupported
+VIR_ERR_SSH = 85 # an ssh error was detected
+VIR_ERR_AGENT_UNRESPONSIVE = 86 # an agent timeout was detected
+VIR_ERR_RESOURCE_BUSY = 87
+VIR_ERR_ACCESS_DENIED = 88
+VIR_ERR_DBUS_SERVICE = 89
+VIR_ERR_STORAGE_VOL_EXIST = 90
+VIR_ERR_CPU_INCOMPATIBLE = 91
+VIR_ERR_XML_INVALID_SCHEMA = 92
diff --git a/en-US/extras/ErrorHandling-Example-3.py
b/en-US/extras/ErrorHandling-Example-3.py
new file mode 100644
index 0000000..55ed4bc
--- /dev/null
+++ b/en-US/extras/ErrorHandling-Example-3.py
@@ -0,0 +1,61 @@
+VIR_FROM_NONE = 0
+VIR_FROM_XEN = 1 # Error at Xen hypervisor layer
+VIR_FROM_XEND = 2 # Error at connection with xend daemon
+VIR_FROM_XENSTORE = 3 # Error at connection with xen store
+VIR_FROM_SEXPR = 4 # Error in the S-Expression code
+VIR_FROM_XML = 5 # Error in the XML code
+VIR_FROM_DOM = 6 # Error when operating on a domain
+VIR_FROM_RPC = 7 # Error in the XML-RPC code
+VIR_FROM_PROXY = 8 # Error in the proxy code
+VIR_FROM_CONF = 9 # Error in the configuration file handling
+VIR_FROM_QEMU = 10 # Error at the QEMU daemon
+VIR_FROM_NET = 11 # Error when operating on a network
+VIR_FROM_TEST = 12 # Error from test driver
+VIR_FROM_REMOTE = 13 # Error from remote driver
+VIR_FROM_OPENVZ = 14 # Error from OpenVZ driver
+VIR_FROM_XENXM = 15 # Error at Xen XM layer
+VIR_FROM_STATS_LINUX = 16 # Error in the Linux Stats code
+VIR_FROM_LXC = 17 # Error from Linux Container driver
+VIR_FROM_STORAGE = 18 # Error from storage driver
+VIR_FROM_NETWORK = 19 # Error from network config
+VIR_FROM_DOMAIN = 20 # Error from domain config
+VIR_FROM_UML = 21 # Error at the UML driver
+VIR_FROM_NODEDEV = 22 # Error from node device monitor
+VIR_FROM_XEN_INOTIFY = 23 # Error from xen inotify layer
+VIR_FROM_SECURITY = 24 # Error from security framework
+VIR_FROM_VBOX = 25 # Error from VirtualBox driver
+VIR_FROM_INTERFACE = 26 # Error when operating on an interface
+VIR_FROM_ONE = 27 # Error from OpenNebula driver
+VIR_FROM_ESX = 28 # Error from ESX driver
+VIR_FROM_PHYP = 29 # Error from IBM power hypervisor
+VIR_FROM_SECRET = 30 # Error from secret storage
+VIR_FROM_CPU = 31 # Error from CPU driver
+VIR_FROM_XENAPI = 32 # Error from XenAPI
+VIR_FROM_NWFILTER = 33 # Error from network filter driver
+VIR_FROM_HOOK = 34 # Error from Synchronous hooks
+VIR_FROM_DOMAIN_SNAPSHOT = 35 # Error from domain snapshot
+VIR_FROM_AUDIT = 36
+VIR_FROM_SYSINFO = 37
+VIR_FROM_STREAMS = 38
+VIR_FROM_VMWARE = 39
+VIR_FROM_EVENT = 40
+VIR_FROM_LIBXL = 41
+VIR_FROM_LOCKING = 42
+VIR_FROM_HYPERV = 43
+VIR_FROM_CAPABILITIES = 44
+VIR_FROM_URI = 45
+VIR_FROM_AUTH = 46
+VIR_FROM_DBUS = 47
+VIR_FROM_PARALLELS = 48
+VIR_FROM_DEVICE = 49
+VIR_FROM_SSH = 50
+VIR_FROM_LOCKSPACE = 51
+VIR_FROM_INITCTL = 52
+VIR_FROM_IDENTITY = 53
+VIR_FROM_CGROUP = 54
+VIR_FROM_ACCESS = 55
+VIR_FROM_SYSTEMD = 56
+VIR_FROM_BHYVE = 57
+VIR_FROM_CRYPTO = 58
+VIR_FROM_FIREWALL = 59
+VIR_FROM_POLKIT = 60
diff --git a/en-US/extras/ErrorHandling-Example-4.py
b/en-US/extras/ErrorHandling-Example-4.py
new file mode 100644
index 0000000..71ca6cd
--- /dev/null
+++ b/en-US/extras/ErrorHandling-Example-4.py
@@ -0,0 +1,3 @@
+VIR_ERR_NONE = 0
+VIR_ERR_WARNING = 1 # A simple warning
+VIR_ERR_ERROR = 2 # An error