summaryrefslogtreecommitdiffstats
path: root/gobject
diff options
context:
space:
mode:
authorGustavo J. A. M. Carneiro <gjc@src.gnome.org>2007-07-07 13:03:55 +0000
committerGustavo J. A. M. Carneiro <gjc@src.gnome.org>2007-07-07 13:03:55 +0000
commit4dcda65e3a00c3b87db3851fc20993884c7d512e (patch)
treeebeb314dc06dd3aa056b037b2c1f40620388fd82 /gobject
parentfe3966c22cbf5e198164b088b4f46f280bc33126 (diff)
downloadpygobject-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.c4
-rw-r--r--gobject/option.py31
-rw-r--r--gobject/pygobject-private.h2
-rw-r--r--gobject/pygoptiongroup.c36
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 *