Hi, The z3c.form doctests make it look like raising zope.interface.Invalid() would be an acceptable thing for a validator to do. It also makes it look like the argument passed to the Invalid() constructor is a string that would be displayed as an error message. However, when I do this (in a constraint or a IValidator adapter), the exception is not caught, and so causes a traceback. In field.py, we have:: try: widget.setErrors = self.setErrors raw = widget.extract() if raw is not interfaces.NO_VALUE: value = interfaces.IDataConverter(widget).toFieldValue(raw) zope.component.getMultiAdapter( (self.content, self.request, self.form, getattr(widget, 'field', None), widget), interfaces.IValidator).validate(value) except (zope.schema.ValidationError, ValueError, MultipleErrors), error: view = zope.component.getMultiAdapter( (error, self.request, widget, widget.field, self.form, self.content), interfaces.IErrorViewSnippet) view.update() if self.setErrors: widget.error = view errors += (view,) And indeed, this doesn't catch Invalid. In error.py, on the other hand, there is an InvalidErrorViewSnippet. Is this intentional? Martin -- Author of `Professional Plone Development`, a book for developers who want to work with Plone. See http://martinaspeli.net/plone-book