diff options
| author | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2007-07-07 13:03:55 +0000 |
|---|---|---|
| committer | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2007-07-07 13:03:55 +0000 |
| commit | 4dcda65e3a00c3b87db3851fc20993884c7d512e (patch) | |
| tree | ebeb314dc06dd3aa056b037b2c1f40620388fd82 /gobject | |
| parent | fe3966c22cbf5e198164b088b4f46f280bc33126 (diff) | |
| download | pygobject-4dcda65e3a00c3b87db3851fc20993884c7d512e.tar.gz pygobject-4dcda65e3a00c3b87db3851fc20993884c7d512e.tar.xz pygobject-4dcda65e3a00c3b87db3851fc20993884c7d512e.zip | |
Bug 342948 – Add exception handling to GOption
svn path=/trunk/; revision=681
Diffstat (limited to 'gobject')
| -rw-r--r-- | gobject/gobjectmodule.c | 4 | ||||
| -rw-r--r-- | gobject/option.py | 31 | ||||
| -rw-r--r-- | gobject/pygobject-private.h | 2 | ||||
| -rw-r--r-- | gobject/pygoptiongroup.c | 36 |
4 files changed, 56 insertions, 17 deletions
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c index bf7b42b..20003b9 100644 --- a/gobject/gobjectmodule.c +++ b/gobject/gobjectmodule.c @@ -3028,7 +3028,7 @@ pyg_error_check(GError **error) * Returns: 0 if no exception has been raised, -1 if it is a * valid gobject.GError, -2 otherwise. */ -static gboolean +gboolean pyg_gerror_exception_check(GError **error) { PyObject *type, *value, *traceback; @@ -3634,6 +3634,8 @@ init_gobject(void) PyModule_AddStringConstant(m, "OPTION_REMAINING", G_OPTION_REMAINING); + PyModule_AddStringConstant(m, "OPTION_ERROR", (char*) g_quark_to_string(G_OPTION_ERROR)); + PyModule_AddIntConstant(m, "SPAWN_LEAVE_DESCRIPTORS_OPEN", G_SPAWN_LEAVE_DESCRIPTORS_OPEN); PyModule_AddIntConstant(m, "SPAWN_DO_NOT_REAP_CHILD", diff --git a/gobject/option.py b/gobject/option.py index ce869d1..14f7780 100644 --- a/gobject/option.py +++ b/gobject/option.py @@ -31,11 +31,16 @@ GOptionGroup in gobject. import sys import optparse -from optparse import OptionError +from optparse import OptParseError, OptionError, OptionValueError, \ + BadOptionError, OptionConflictError import _gobject as gobject __all__ = [ + "OptParseError", "OptionError", + "OptionValueError", + "BadOptionError", + "OptionConflictError" "Option", "OptionGroup", "OptionParser", @@ -172,7 +177,15 @@ class OptionGroup(optparse.OptionGroup): opt = self._long_opt[option_name] else: opt = self._short_opt[option_name] - opt.process(option_name, option_value, self.values, parser) + + try: + opt.process(option_name, option_value, self.values, parser) + except OptionValueError, error: + gerror = gobject.GError(str(error)) + gerror.domain = gobject.OPTION_ERROR + gerror.code = gobject.OPTION_ERROR_BAD_VALUE + gerror.message = str(error) + raise gerror group = gobject.OptionGroup(self.name, self.description, self.help_description, callback) @@ -301,5 +314,19 @@ class OptionParser(optparse.OptionParser): context = self._to_goptioncontext(values) largs.extend(context.parse([sys.argv[0]] + rargs)) + def parse_args(self, args=None, values=None): + try: + return optparse.OptionParser.parse_args(self, args, values) + except gobject.GError, error: + if error.domain != gobject.OPTION_ERROR: + raise + if error.code == gobject.OPTION_ERROR_BAD_VALUE: + raise OptionValueError(error.message) + elif error.code == gobject.OPTION_ERROR_UNKNOWN_OPTION: + raise BadOptionError(error.message) + elif error.code == gobject.OPTION_ERROR_FAILED: + raise OptParseError(error.message) + else: + raise make_option = Option diff --git a/gobject/pygobject-private.h b/gobject/pygobject-private.h index 45e431c..4b41338 100644 --- a/gobject/pygobject-private.h +++ b/gobject/pygobject-private.h @@ -101,6 +101,8 @@ PyObject *pyg_integer_richcompare(PyObject *v, PyObject *w, int op); +gboolean pyg_gerror_exception_check(GError **error); + /* from pygtype.h */ extern PyTypeObject PyGTypeWrapper_Type; diff --git a/gobject/pygoptiongroup.c b/gobject/pygoptiongroup.c index 09058d8..6465401 100644 --- a/gobject/pygoptiongroup.c +++ b/gobject/pygoptiongroup.c @@ -25,6 +25,7 @@ #endif #include "pygobject-private.h" +#include "pygobject.h" static gboolean check_if_owned(PyGOptionGroup *self) @@ -38,8 +39,8 @@ check_if_owned(PyGOptionGroup *self) return FALSE; } - -static void destroy_g_group(PyGOptionGroup *self) +static void +destroy_g_group(PyGOptionGroup *self) { PyGILState_STATE state; state = pyg_gil_state_ensure(); @@ -100,30 +101,37 @@ static gboolean arg_func(const gchar *option_name, const gchar *value, PyGOptionGroup *self, - GError *error) + GError **error) { PyObject *ret; PyGILState_STATE state; - + gboolean no_error; + state = pyg_gil_state_ensure(); if (value == NULL) + { ret = PyObject_CallFunction(self->callback, "sOO", option_name, Py_None, self); + } else + { ret = PyObject_CallFunction(self->callback, "ssO", option_name, value, self); + } - if (ret == NULL) - PyErr_Print(); - - pyg_gil_state_release(state); - - if (ret == NULL) - return FALSE; - - Py_DECREF(ret); - return TRUE; + if (ret != NULL) + { + Py_DECREF(ret); + pyg_gil_state_release(state); + return TRUE; + } + else + { + no_error = pyg_gerror_exception_check(error) != -1; + pyg_gil_state_release(state); + return no_error; + } } static PyObject * |
