summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Reiter <reiter.christoph@gmail.com>2018-05-04 19:54:15 +0000
committerChristoph Reiter <reiter.christoph@gmail.com>2018-05-04 19:54:15 +0000
commit83759794ae64253a64aac7cc8c124c8c8aa7c7ca (patch)
treedfe6e778d7adf92ea3280afefad3bc0e1d8922ef
parentdd2a6c36b2a8960d05b81d46fb6b1cc063222497 (diff)
parentdda8ee3cf4e3e45b6376ad66a161b0380bd4bb34 (diff)
downloadpygobject-83759794ae64253a64aac7cc8c124c8c8aa7c7ca.tar.gz
Merge branch 'gerror-docs' into 'master'
docs: Add introduction to handling GLib.Error See merge request GNOME/pygobject!69
-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..e392cca2
--- /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:`GLib.Error.domain` is the error domain, usually a string that you can
+ convert to a ``GLib`` quark with :func:`GLib.quark_from_string`
+* :attr:`GLib.Error.code` identifies a specific error within the domain
+* :attr:`GLib.Error.message` is a human-readable description of the error
+
+Error domains are defined per-module, and you can get an error domain from
+``*_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
+possible error code values 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