summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Willadsen <kai.willadsen@gmail.com>2018-05-04 09:03:42 +1000
committerKai Willadsen <kai.willadsen@gmail.com>2018-05-04 09:14:10 +1000
commit643b8d0eac4e0f4535f153336d79aff3a4d7cace (patch)
tree570627b38fa4e2d73feea77bf6d26f2b7c3a010a
parent9c671606cc93a06e6db3ee5ee5f0862a7bfc21f9 (diff)
downloadpygobject-643b8d0eac4e0f4535f153336d79aff3a4d7cace.tar.gz
docs: Add introduction to handling GLib.Error
-rw-r--r--docs/guide/api/error_handling.rst48
-rw-r--r--docs/guide/api/index.rst1
2 files changed, 49 insertions, 0 deletions
diff --git a/docs/guide/api/error_handling.rst b/docs/guide/api/error_handling.rst
new file mode 100644
index 00000000..6ad67a94
--- /dev/null
+++ b/docs/guide/api/error_handling.rst
@@ -0,0 +1,48 @@
+==============
+Error Handling
+==============
+
+GLib has its own method of handling errors using :obj:`GLib.Error`. These are
+raised as Python exceptions, but with a few small differences.
+
+It's common in Python for exception subclasses to be used (e.g.,
+:obj:`ValueError` versus :obj:`IOError`) to distinguish different types of
+errors. Libraries often define their own :obj:`Exception` subclasses, and library
+users will handle these cases explicitly.
+
+In GLib-using libraries, errors are all :obj:`GLib.Error` instances, with no
+subclassing for different error types. Instead, every :obj:`GLib.Error`
+instance has attributes that distinguish types of error:
+
+* :attr:`domain` is the error domain, usually a string that you can covert to
+ a `GLib` quark with :func:`GLib.quark_to_string`
+* :attr:`code` identifies a specific error within the domain
+* :attr:`message` is a human-readable description of the error
+
+Error domains are defined per-module, and you can get an error domain from
+:func:`*_error_quark` functions on the relevant module. For example, IO errors
+from `Gio` are in the domain returned by :func:`Gio.io_error_quark`, and the
+possible values for :attr:`code` are enumerated in :obj:`Gio.IOErrorEnum`.
+
+Once you've caught a :obj:`GLib.Error`, you can call
+:meth:`GLib.Error.matches` to see whether it matches the specific error you
+want to handle.
+
+
+Examples
+--------
+
+Catching a specific error:
+
+.. code:: pycon
+
+ >>> from gi.repository import GLib, Gio
+ >>> f = Gio.File.new_for_path('missing-path')
+ >>> try:
+ ... f.read()
+ ... except GLib.Error as err:
+ ... if err.matches(Gio.io_error_quark(), Gio.IOErrorEnum.NOT_FOUND):
+ ... print('File not found')
+ ... else:
+ ... raise
+ File not found
diff --git a/docs/guide/api/index.rst b/docs/guide/api/index.rst
index efeade31..41f17ab5 100644
--- a/docs/guide/api/index.rst
+++ b/docs/guide/api/index.rst
@@ -10,3 +10,4 @@ API Reference
basic_types
flags_enums
gobject
+ error_handling