Error Handling

GLib has its own method of handling errors using 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., ValueError versus IOError) to distinguish different types of errors. Libraries often define their own Exception subclasses, and library users will handle these cases explicitly.

In GLib-using libraries, errors are all GLib.Error instances, with no subclassing for different error types. Instead, every GLib.Error instance has attributes that distinguish types of 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 Gio.io_error_quark(), and possible error code values are enumerated in Gio.IOErrorEnum.

Once you’ve caught a GLib.Error, you can call GLib.Error.matches() to see whether it matches the specific error you want to handle.


Catching a specific error:

>>> from gi.repository import GLib, Gio
>>> f = Gio.File.new_for_path('missing-path')
>>> try:
... 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