mgedmin: > Yes, there's still a bit of repetition in that final case, but that seems OK to me?

But why?  The traceback looks the same, and the displayed exception message is the same.  What does the user gain from this duplication?
diff --git a/CHANGES.rst b/CHANGES.rst
index 93d7bef..19389a2 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,7 +4,8 @@ Changes
 4.2.3 (unreleased)
 ------------------
 
-- Nothing changed yet.
+- Simplify exception chaining and nested exception error messages.
+  See `issue 43 <https://github.com/zopefoundation/zope.configuration/issues/43>`_.
 
 
 4.2.2 (2018-09-27)
diff --git a/docs/narr.rst b/docs/narr.rst
index fc7d804..fa60dc4 100644
--- a/docs/narr.rst
+++ b/docs/narr.rst
@@ -1162,16 +1162,15 @@ redefine our directives:
 .. doctest::
 
    >>> from zope.configuration.xmlconfig import string
-   >>> from zope.configuration.xmlconfig import ZopeXMLConfigurationError
-   >>> try:
-   ...    v = string(
+   >>> from zope.configuration.exceptions import ConfigurationError
+   >>> v = string(
    ...      '<text xmlns="http://sample.namespaces.zope.org/schema" name="x" />',
    ...      context)
-   ... except ZopeXMLConfigurationError as e:
-   ...   v = e
-   >>> print(v)
-   File "<string>", line 1.0
-       ConfigurationError: The directive ('http://sample.namespaces.zope.org/schema', 'text') cannot be used in this context
+   Traceback (most recent call last):
+   ...
+   zope.configuration.exceptions.ConfigurationError: The directive ('http://sample.namespaces.zope.org/schema', 'text') cannot be used in this context
+     File "<string>", line 1.0
+
 
 Let's see what happens if we declare duplicate fields:
 
@@ -1187,7 +1186,7 @@ Let's see what happens if we declare duplicate fields:
    ...      </schema>
    ...      ''',
    ...      context)
-   ... except ZopeXMLConfigurationError as e:
+   ... except ConfigurationError as e:
    ...   v = e
    >>> print(v)
    File "<string>", line 5.7-5.24
diff --git a/src/zope/configuration/config.py b/src/zope/configuration/config.py
index e7ba289..0123021 100644
--- a/src/zope/configuration/config.py
+++ b/src/zope/configuration/config.py
@@ -27,6 +27,7 @@ from zope.schema import URI
 from zope.schema import ValidationError
 
 from zope.configuration.exceptions import ConfigurationError
+from zope.configuration.exceptions import ConfigurationWrapperError
 from zope.configuration.interfaces import IConfigurationContext
 from zope.configuration.interfaces import IGroupingContext
 from zope.configuration.fields import GlobalInterface
@@ -41,7 +42,6 @@ __all__ = [
     'ConfigurationContext',
     'ConfigurationAdapterRegistry',
     'ConfigurationMachine',
-    'ConfigurationExecutionError',
     'IStackItem',
     'SimpleStackItem',
     'RootStackItem',
@@ -74,10 +74,14 @@ testns = 'http://namespaces.zope.org/test'
 
 
 class ConfigurationContext(object):
-    """Mix-in that implements IConfigurationContext
+    """
+    Mix-in for implementing.
+    :class:`zope.configuration.interfaces.IConfigurationContext`.
 
-    Subclasses provide a ``package`` attribute and a ``basepath``
-    attribute.  If the base path is not None, relative paths are
+    Note that this class itself does not actually declare that it
+    implements that interface; the subclass must do that. In addition,
+    subclasses must provide a ``package`` attribute and a ``basepath``
+    attribute. If the base path is not None, relative paths are
     converted to absolute paths using the the base path. If the
     package is not none, relative imports are performed relative to
     the package.
@@ -91,34 +95,38 @@ class ConfigurationContext(object):
     attribute.
 
     The include path is appended to each action and is used when
-    resolving conflicts among actions.  Normally, only the a
+    resolving conflicts among actions. Normally, only the a
     ConfigurationMachine provides the actions attribute. Decorators
     simply use the actions of the context they decorate. The
-    ``includepath`` attribute is a tuple of names.  Each name is
+    ``includepath`` attribute is a tuple of names. Each name is
     typically the name of an included configuration file.
 
     The ``info`` attribute contains descriptive information helpful
-    when reporting errors.  If not set, it defaults to an empty string.
-
-    The actions attribute is a sequence of dictionaries where each dictionary
-    has the following keys:
+    when reporting errors. If not set, it defaults to an empty string.
 
-      - ``discriminator``, a value that identifies the action. Two actions
-        that have the same (non None) discriminator conflict.
+    The actions attribute is a sequence of dictionaries where each
+    dictionary has the following keys:
 
-      - ``callable``, an object that is called to execute the action,
+        - ``discriminator``, a value that identifies the action. Two
+          actions that have the same (non None) discriminator
+          conflict.
 
-      - ``args``, positional arguments for the action
+        - ``callable``, an object that is called to execute the
+          action,
 
-      - ``kw``, keyword arguments for the action
+        - ``args``, positional arguments for the action
 
-      - ``includepath``, a tuple of include file names (defaults to ())
+        - ``kw``, keyword arguments for the action
 
-      - ``info``, an object that has descriptive information about
-        the action (defaults to '')
+        - ``includepath``, a tuple of include file names (defaults to
+          ())
 
+        - ``info``, an object that has descriptive information about
+          the action (defaults to '')
     """
 
+    # pylint:disable=no-member
+
     def __init__(self):
         super(ConfigurationContext, self).__init__()
         self._seen_files = set()
@@ -666,8 +674,8 @@ class ConfigurationMachine(ConfigurationAdapterRegistry, ConfigurationContext):
     info = ''
 
     #: These `Exception` subclasses are allowed to be raised from `execute_actions`
-    #: without being re-wrapped into a `ConfigurationExecutionError`. (`BaseException`
-    #: instances are never wrapped.)
+    #: without being re-wrapped into a `~.ConfigurationError`. (`BaseException`
+    #: and other `~.ConfigurationError` instances are never wrapped.)
     #:
     #: Users of instances of this class may modify this before calling `execute_actions`
     #: if they need to propagate specific exceptions.
@@ -727,9 +735,8 @@ class ConfigurationMachine(ConfigurationAdapterRegistry, ConfigurationContext):
             [('f', (1,), {}), ('f', (2,), {})]
 
         If the action raises an error, we convert it to a
-        ConfigurationExecutionError.
+        `~.ConfigurationError`.
 
-            >>> from zope.configuration.config import ConfigurationExecutionError
             >>> output = []
             >>> def bad():
             ...    bad.xxx
@@ -739,22 +746,35 @@ class ConfigurationMachine(ConfigurationAdapterRegistry, ConfigurationContext):
             ...   (2, f, (2,)),
             ...   (3, bad, (), {}, (), 'oops')
             ...   ]
-            >>> try:
-            ...    v = context.execute_actions()
-            ... except ConfigurationExecutionError as e:
-            ...    v = e
-            >>> lines = str(v).splitlines()
-            >>> 'AttributeError' in lines[0]
-            True
-            >>> lines[0].endswith("'function' object has no attribute 'xxx'")
-            True
-            >>> lines[1:]
-            ['  in:', '  oops']
+
+            >>> context.execute_actions()
+            Traceback (most recent call last):
+            ...
+            zope.configuration.config.ConfigurationExecutionError: oops
+                AttributeError: 'function' object has no attribute 'xxx'
 
         Note that actions executed before the error still have an effect:
 
             >>> output
             [('f', (1,), {}), ('f', (2,), {})]
+
+        If the exception was already a `~.ConfigurationError`, it is raised
+        as-is with the action's ``info`` added.
+
+            >>> def bad():
+            ...     raise ConfigurationError("I'm bad")
+            >>> context.actions = [
+            ...   (1, f, (1,)),
+            ...   (1, f, (11,), {}, ('x', )),
+            ...   (2, f, (2,)),
+            ...   (3, bad, (), {}, (), 'oops')
+            ...   ]
+            >>> context.execute_actions()
+            Traceback (most recent call last):
+            ...
+            zope.configuration.exceptions.ConfigurationError: I'm bad
+                oops
+
         """
         pass_through_exceptions = self.pass_through_exceptions
         if testing:
@@ -769,29 +789,23 @@ class ConfigurationMachine(ConfigurationAdapterRegistry, ConfigurationContext):
                 info = action['info']
                 try:
                     callable(*args, **kw)
+                except ConfigurationError as ex:
+                    ex.add_details(info)
+                    raise
                 except pass_through_exceptions:
                     raise
                 except Exception:
-                    t, v, tb = sys.exc_info()
-                    try:
-                        reraise(ConfigurationExecutionError(t, v, info),
-                                None, tb)
-                    finally:
-                        del t, v, tb
-
+                    # Wrap it up and raise.
+                    reraise(ConfigurationExecutionError(info, sys.exc_info()[1]),
+                            None, sys.exc_info()[2])
         finally:
             if clear:
                 del self.actions[:]
 
-class ConfigurationExecutionError(ConfigurationError):
+class ConfigurationExecutionError(ConfigurationWrapperError):
     """
     An error occurred during execution of a configuration action
     """
-    def __init__(self, etype, evalue, info):
-        self.etype, self.evalue, self.info = etype, evalue, info
-
-    def __str__(self): # pragma: no cover
-        return "%s: %s\n  in:\n  %s" % (self.etype, self.evalue, self.info)
 
 ##############################################################################
 # Stack items
@@ -1671,15 +1685,16 @@ def toargs(context, schema, data):
             try:
                 args[str(name)] = field.fromUnicode(s)
             except ValidationError as v:
-                reraise(ConfigurationError("Invalid value for", n, str(v)),
+                reraise(ConfigurationError("Invalid value for %r" % (n)).add_details(v),
                         None, sys.exc_info()[2])
         elif field.required:
             # if the default is valid, we can use that:
             default = field.default
             try:
                 field.validate(default)
-            except ValidationError:
-                raise ConfigurationError("Missing parameter:", n)
+            except ValidationError as v:
+                reraise(ConfigurationError("Missing parameter: %r" % (n,)).add_details(v),
+                        None, sys.exc_info()[2])
             args[str(name)] = default
 
     if data:
@@ -1801,9 +1816,10 @@ def resolveConflicts(actions):
 class ConfigurationConflictError(ConfigurationError):
 
     def __init__(self, conflicts):
+        super(ConfigurationConflictError, self).__init__()
         self._conflicts = conflicts
 
-    def __str__(self): #pragma NO COVER
+    def _with_details(self, opening, detail_formatter):
         r = ["Conflicting configuration actions"]
         for discriminator, infos in sorted(self._conflicts.items()):
             r.append("  For: %s" % (discriminator, ))
@@ -1811,7 +1827,8 @@ class ConfigurationConflictError(ConfigurationError):
                 for line in text_type(info).rstrip().split(u'\n'):
                     r.append(u"    " + line)
 
-        return "\n".join(r)
+        opening = "\n".join(r)
+        return super(ConfigurationConflictError, self)._with_details(opening, detail_formatter)
 
 
 ##############################################################################
diff --git a/src/zope/configuration/exceptions.py b/src/zope/configuration/exceptions.py
index dce50a7..abac17a 100644
--- a/src/zope/configuration/exceptions.py
+++ b/src/zope/configuration/exceptions.py
@@ -14,6 +14,8 @@
 """Standard configuration errors
 """
 
+import traceback
+
 __all__ = [
     'ConfigurationError',
 ]
@@ -21,3 +23,48 @@ __all__ = [
 class ConfigurationError(Exception):
     """There was an error in a configuration
     """
+
+    # A list of strings or things that can be converted to strings,
+    # added by append_details as we walk back up the call/include stack.
+    # We will print them in reverse order so that the most recent detail is
+    # last.
+    _details = ()
+
+    def add_details(self, info):
+        if isinstance(info, BaseException):
+            info = traceback.format_exception_only(type(info), info)
+            # Trim trailing newline
+            info[-1] = info[-1].rstrip()
+            self._details += tuple(info)
+        else:
+            self._details += (info,)
+        return self
+
+    def _with_details(self, opening, detail_formatter):
+        lines = ['    ' + detail_formatter(detail) for detail in self._details]
+        lines.append(opening)
+        lines.reverse()
+        return '\n'.join(lines)
+
+    def __str__(self):
+        s = super(ConfigurationError, self).__str__()
+        return self._with_details(s, str)
+
+    def __repr__(self):
+        s = super(ConfigurationError, self).__repr__()
+        return self._with_details(s, repr)
+
+
+class ConfigurationWrapperError(ConfigurationError):
+
+    USE_INFO_REPR = False
+
+    def __init__(self, info, exception):
+        super(ConfigurationWrapperError, self).__init__(repr(info) if self.USE_INFO_REPR else info)
+        self.add_details(exception)
+
+        # This stuff is undocumented and not used but we store
+        # for backwards compatibility
+        self.info = info
+        self.etype = type(exception)
+        self.evalue = exception
diff --git a/src/zope/configuration/xmlconfig.py b/src/zope/configuration/xmlconfig.py
index e979e13..4fc0d0d 100644
--- a/src/zope/configuration/xmlconfig.py
+++ b/src/zope/configuration/xmlconfig.py
@@ -40,14 +40,13 @@ from zope.configuration.config import GroupingContextDecorator
 from zope.configuration.config import GroupingStackItem
 from zope.configuration.config import resolveConflicts
 from zope.configuration.exceptions import ConfigurationError
+from zope.configuration.exceptions import ConfigurationWrapperError
 from zope.configuration.fields import GlobalObject
 from zope.configuration.zopeconfigure import IZopeConfigure
 from zope.configuration.zopeconfigure import ZopeConfigure
 from zope.configuration._compat import reraise
 
 __all__ = [
-    'ZopeXMLConfigurationError',
-    'ZopeSAXParseException',
     'ParserInfo',
     'ConfigurationHandler',
     'processxmlfile',
@@ -70,7 +69,7 @@ ZCML_NAMESPACE = "http://namespaces.zope.org/zcml"
 ZCML_CONDITION = (ZCML_NAMESPACE, u"condition")
 
 
-class ZopeXMLConfigurationError(ConfigurationError):
+class ZopeXMLConfigurationError(ConfigurationWrapperError):
     """
     Zope XML Configuration error
 
@@ -80,41 +79,28 @@ class ZopeXMLConfigurationError(ConfigurationError):
     Example
 
         >>> from zope.configuration.xmlconfig import ZopeXMLConfigurationError
-        >>> v = ZopeXMLConfigurationError("blah", AttributeError, "xxx")
+        >>> v = ZopeXMLConfigurationError("blah", AttributeError("xxx"))
         >>> print(v)
         'blah'
             AttributeError: xxx
     """
-    def __init__(self, info, etype, evalue):
-        self.info, self.etype, self.evalue = info, etype, evalue
 
-    def __str__(self):
-        # Only use the repr of the info. This is because we expect to
-        # get a parse info and we only want the location information.
-        return "%s\n    %s: %s" % (
-            repr(self.info), self.etype.__name__, self.evalue)
+    USE_INFO_REPR = True
+
 
-class ZopeSAXParseException(ConfigurationError):
+class ZopeSAXParseException(ConfigurationWrapperError):
     """
-    Sax Parser errors, reformatted in an emacs friendly way.
+    Sax Parser errors as a ConfigurationError.
 
     Example
 
         >>> from zope.configuration.xmlconfig import ZopeSAXParseException
-        >>> v = ZopeSAXParseException("foo.xml:12:3:Not well formed")
+        >>> v = ZopeSAXParseException("info", Exception("foo.xml:12:3:Not well formed"))
         >>> print(v)
-        File "foo.xml", line 12.3, Not well formed
+        info
+            Exception: foo.xml:12:3:Not well formed
     """
-    def __init__(self, v):
-        self._v = v
 
-    def __str__(self):
-        v = self._v
-        s = tuple(str(v).split(':'))
-        if len(s) == 4:
-            return 'File "%s", line %s.%s, %s' % s
-        else:
-            return str(v)
 
 class ParserInfo(object):
     r"""
@@ -238,6 +224,16 @@ class ConfigurationHandler(ContentHandler):
     def characters(self, text):
         self.context.getInfo().characters(text)
 
+    def _handle_exception(self, ex, info):
+        if self.testing:
+            raise
+        if isinstance(ex, ConfigurationError):
+            ex.add_details(repr(info))
+            raise
+
+        exc = ZopeXMLConfigurationError(info, ex)
+        reraise(exc, None, sys.exc_info()[2])
+
     def startElementNS(self, name, qname, attrs):
         if self.ignore_depth:
             self.ignore_depth += 1
@@ -268,13 +264,8 @@ class ConfigurationHandler(ContentHandler):
 
         try:
             self.context.begin(name, data, info)
-        except Exception:
-            if self.testing:
-                raise
-            reraise(ZopeXMLConfigurationError(info,
-                                              sys.exc_info()[0],
-                                              sys.exc_info()[1]),
-                    None, sys.exc_info()[2])
+        except Exception as ex:
+            self._handle_exception(ex, info)
 
         self.context.setInfo(info)
 
@@ -398,13 +389,8 @@ class ConfigurationHandler(ContentHandler):
 
         try:
             self.context.end()
-        except Exception:
-            if self.testing:
-                raise
-            reraise(ZopeXMLConfigurationError(info,
-                                              sys.exc_info()[0],
-                                              sys.exc_info()[1]),
-                    None, sys.exc_info()[2])
+        except Exception as ex:
+            self._handle_exception(ex, info)
 
 
 def processxmlfile(file, context, testing=False):
@@ -420,7 +406,7 @@ def processxmlfile(file, context, testing=False):
     try:
         parser.parse(src)
     except SAXParseException:
-        reraise(ZopeSAXParseException(sys.exc_info()[1]),
+        reraise(ZopeSAXParseException(file, sys.exc_info()[1]),
                 None, sys.exc_info()[2])
 
 

Exception chaining is excessive
There were some recent zope.schema and/or zope.configuration releases that broke ZODBBrowser (and many other things).  This bug is not about that.  This bug is about error reporting on Python 3.

Here's the series of chained exception tracebacks I get on Python 3.6 when there's an error in a ZCML file (included from a sequence of other ZCML files):

```
Traceback (most recent call last):
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 817, in toargs
    args[str(name)] = field.fromUnicode(s)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/fields.py", line 85, in fromUnicode
    self._DOT_VALIDATOR.validate(to_validate)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_bootstrapfields.py", line 291, in validate
    self._validate(value)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_field.py", line 670, in _validate
    raise InvalidDottedName(value).with_field_and_value(self, value)
zope.schema.interfaces.InvalidDottedName: .systemerror.SystemErrorView

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 471, in finish
    args = toargs(context, *self.argdata)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 820, in toargs
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 817, in toargs
    args[str(name)] = field.fromUnicode(s)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/fields.py", line 85, in fromUnicode
    self._DOT_VALIDATOR.validate(to_validate)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_bootstrapfields.py", line 291, in validate
    self._validate(value)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_field.py", line 670, in _validate
    raise InvalidDottedName(value).with_field_and_value(self, value)
zope.configuration.exceptions.ConfigurationError: ('Invalid value for', 'class', '.systemerror.SystemErrorView')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 472, in finish
    actions = self.handler(context, **args)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 398, in include
    processxmlfile(f, context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 290, in processxmlfile
    parser.parse(src)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "/home/mg/src/cpython/Modules/pyexpat.c", line 466, in EndElement
    ("(N)", string_intern(self, name)))
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 276, in endElementNS
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 471, in finish
    args = toargs(context, *self.argdata)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 820, in toargs
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 817, in toargs
    args[str(name)] = field.fromUnicode(s)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/fields.py", line 85, in fromUnicode
    self._DOT_VALIDATOR.validate(to_validate)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_bootstrapfields.py", line 291, in validate
    self._validate(value)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_field.py", line 670, in _validate
    raise InvalidDottedName(value).with_field_and_value(self, value)
zope.configuration.xmlconfig.ZopeXMLConfigurationError: File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/app/exception/browser/configure.zcml", line 5.2-11.8
    ConfigurationError: ('Invalid value for', 'class', '.systemerror.SystemErrorView')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 472, in finish
    actions = self.handler(context, **args)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 398, in include
    processxmlfile(f, context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 290, in processxmlfile
    parser.parse(src)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "/home/mg/src/cpython/Modules/pyexpat.c", line 466, in EndElement
    ("(N)", string_intern(self, name)))
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 276, in endElementNS
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 472, in finish
    actions = self.handler(context, **args)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 398, in include
    processxmlfile(f, context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 290, in processxmlfile
    parser.parse(src)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "/home/mg/src/cpython/Modules/pyexpat.c", line 466, in EndElement
    ("(N)", string_intern(self, name)))
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 276, in endElementNS
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 471, in finish
    args = toargs(context, *self.argdata)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 820, in toargs
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 817, in toargs
    args[str(name)] = field.fromUnicode(s)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/fields.py", line 85, in fromUnicode
    self._DOT_VALIDATOR.validate(to_validate)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_bootstrapfields.py", line 291, in validate
    self._validate(value)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_field.py", line 670, in _validate
    raise InvalidDottedName(value).with_field_and_value(self, value)
zope.configuration.xmlconfig.ZopeXMLConfigurationError: File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/app/zcmlfiles/browser.zcml", line 16.2-16.50
    ZopeXMLConfigurationError: File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/app/exception/browser/configure.zcml", line 5.2-11.8
    ConfigurationError: ('Invalid value for', 'class', '.systemerror.SystemErrorView')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 472, in finish
    actions = self.handler(context, **args)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 398, in include
    processxmlfile(f, context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 290, in processxmlfile
    parser.parse(src)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "/home/mg/src/cpython/Modules/pyexpat.c", line 466, in EndElement
    ("(N)", string_intern(self, name)))
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 276, in endElementNS
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 472, in finish
    actions = self.handler(context, **args)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 398, in include
    processxmlfile(f, context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 290, in processxmlfile
    parser.parse(src)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "/home/mg/src/cpython/Modules/pyexpat.c", line 466, in EndElement
    ("(N)", string_intern(self, name)))
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 276, in endElementNS
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 472, in finish
    actions = self.handler(context, **args)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 398, in include
    processxmlfile(f, context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 290, in processxmlfile
    parser.parse(src)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "/home/mg/src/cpython/Modules/pyexpat.c", line 466, in EndElement
    ("(N)", string_intern(self, name)))
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 276, in endElementNS
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 471, in finish
    args = toargs(context, *self.argdata)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 820, in toargs
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 817, in toargs
    args[str(name)] = field.fromUnicode(s)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/fields.py", line 85, in fromUnicode
    self._DOT_VALIDATOR.validate(to_validate)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_bootstrapfields.py", line 291, in validate
    self._validate(value)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_field.py", line 670, in _validate
    raise InvalidDottedName(value).with_field_and_value(self, value)
zope.configuration.xmlconfig.ZopeXMLConfigurationError: File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/app/zcmlfiles/configure.zcml", line 80.2-80.33
    ZopeXMLConfigurationError: File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/app/zcmlfiles/browser.zcml", line 16.2-16.50
    ZopeXMLConfigurationError: File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/app/exception/browser/configure.zcml", line 5.2-11.8
    ConfigurationError: ('Invalid value for', 'class', '.systemerror.SystemErrorView')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/testrunner/runner.py", line 449, in run_layer
    setup_layer(options, layer, setup_layers)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/testrunner/runner.py", line 770, in setup_layer
    layer.setUp()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zodbbrowser/ftests/test_standalone.py", line 140, in setUp
    cls.server.run(cls.data_fs, '--rw')
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zodbbrowser/ftests/test_standalone.py", line 90, in run
    main(list(args), start_serving=False)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zodbbrowser/standalone.py", line 275, in main
    configure(options)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zodbbrowser/standalone.py", line 105, in configure
    context = xmlconfig.string(options.site_definition, context=context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 513, in string
    processxmlfile(f, context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 290, in processxmlfile
    parser.parse(src)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "/home/mg/src/cpython/Modules/pyexpat.c", line 466, in EndElement
    ("(N)", string_intern(self, name)))
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 276, in endElementNS
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 472, in finish
    actions = self.handler(context, **args)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 398, in include
    processxmlfile(f, context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 290, in processxmlfile
    parser.parse(src)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "/home/mg/src/cpython/Modules/pyexpat.c", line 466, in EndElement
    ("(N)", string_intern(self, name)))
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 276, in endElementNS
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 472, in finish
    actions = self.handler(context, **args)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 398, in include
    processxmlfile(f, context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 290, in processxmlfile
    parser.parse(src)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "/home/mg/src/cpython/Modules/pyexpat.c", line 466, in EndElement
    ("(N)", string_intern(self, name)))
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 276, in endElementNS
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 472, in finish
    actions = self.handler(context, **args)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 398, in include
    processxmlfile(f, context)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 290, in processxmlfile
    parser.parse(src)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "/home/mg/src/cpython/Modules/pyexpat.c", line 466, in EndElement
    ("(N)", string_intern(self, name)))
  File "/home/mg/opt/python37/lib/python3.7/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 276, in endElementNS
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/xmlconfig.py", line 269, in endElementNS
    self.context.end()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 363, in end
    self.stack.pop().finish()
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 471, in finish
    args = toargs(context, *self.argdata)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 820, in toargs
    None, sys.exc_info()[2])
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/_compat.py", line 30, in reraise
    raise value.with_traceback(tb)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/config.py", line 817, in toargs
    args[str(name)] = field.fromUnicode(s)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/configuration/fields.py", line 85, in fromUnicode
    self._DOT_VALIDATOR.validate(to_validate)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_bootstrapfields.py", line 291, in validate
    self._validate(value)
  File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/schema/_field.py", line 670, in _validate
    raise InvalidDottedName(value).with_field_and_value(self, value)
zope.configuration.xmlconfig.ZopeXMLConfigurationError: File "<string>", line 7.10-7.50
    ZopeXMLConfigurationError: File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/app/zcmlfiles/configure.zcml", line 80.2-80.33
    ZopeXMLConfigurationError: File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/app/zcmlfiles/browser.zcml", line 16.2-16.50
    ZopeXMLConfigurationError: File "/home/mg/src/zodbbrowser/.tox/py37/lib/python3.7/site-packages/zope/app/exception/browser/configure.zcml", line 5.2-11.8
    ConfigurationError: ('Invalid value for', 'class', '.systemerror.SystemErrorView')
```

It looks like every include adds a new exception (with full traceback) to the chain.

Can we use `raise ... from None` to disable chaining so there's only one traceback in the end?
diff --git a/src/zope/configuration/tests/test_config.py b/src/zope/configuration/tests/test_config.py
index 4bd5930..ab21589 100644
--- a/src/zope/configuration/tests/test_config.py
+++ b/src/zope/configuration/tests/test_config.py
@@ -1789,7 +1789,18 @@ class Test_toargs(unittest.TestCase):
         with self.assertRaises(ConfigurationError) as exc:
             self._callFUT(context, ISchema, {})
         self.assertEqual(exc.exception.args,
-                         ('Missing parameter:', 'no_default'))
+                         ("Missing parameter: 'no_default'",))
+
+        # It includes the details of any validation failure;
+        # The rendering of the nested exception varies by Python version,
+        # sadly.
+        exception_str = str(exc.exception)
+        self.assertTrue(exception_str.startswith(
+            "Missing parameter: 'no_default'\n"
+        ), exception_str)
+        self.assertTrue(exception_str.endswith(
+            "RequiredMissing: no_default"
+        ), exception_str)
 
     def test_w_field_missing_but_default(self):
         from zope.interface import Interface
@@ -1810,8 +1821,16 @@ class Test_toargs(unittest.TestCase):
         with self.assertRaises(ConfigurationError) as exc:
             self._callFUT(context, ISchema, {'count': '-1'})
         self.assertEqual(exc.exception.args,
-                         ('Invalid value for', 'count', '(-1, 0)'))
+                         ("Invalid value for 'count'",))
 
+        for meth in str, repr:
+            exception_str = meth(exc.exception)
+            self.assertIn(
+                "Invalid value for",
+                exception_str)
+            self.assertIn(
+                "TooSmall: (-1, 0)",
+                exception_str)
 
 class Test_expand_action(unittest.TestCase):
 
@@ -1974,6 +1993,14 @@ class Test_resolveConflicts(unittest.TestCase):
             "For: ('a', 1)\n    conflict!\n    conflict2!",
             str(exc.exception))
 
+        exc.exception.add_details('a detail')
+
+        self.assertEqual(
+            "Conflicting configuration actions\n  "
+            "For: ('a', 1)\n    conflict!\n    conflict2!\n"
+            "    a detail",
+            str(exc.exception))
+
     def test_wo_discriminators_final_sorting_order(self):
         from zope.configuration.config import expand_action
         def _a():
diff --git a/src/zope/configuration/tests/test_xmlconfig.py b/src/zope/configuration/tests/test_xmlconfig.py
index e75a8f0..3cb1270 100644
--- a/src/zope/configuration/tests/test_xmlconfig.py
+++ b/src/zope/configuration/tests/test_xmlconfig.py
@@ -29,6 +29,7 @@ BVALUE = u'bvalue'
 # pylint:disable=protected-access
 
 class ZopeXMLConfigurationErrorTests(unittest.TestCase):
+    maxDiff = None
 
     def _getTargetClass(self):
         from zope.configuration.xmlconfig import ZopeXMLConfigurationError
@@ -38,11 +39,16 @@ class ZopeXMLConfigurationErrorTests(unittest.TestCase):
         return self._getTargetClass()(*args, **kw)
 
     def test___str___uses_repr_of_info(self):
-        zxce = self._makeOne('info', Exception, 'value')
-        self.assertEqual(str(zxce), "'info'\n    Exception: value")
+        zxce = self._makeOne('info', Exception('value'))
+        self.assertEqual(
+            str(zxce),
+            "'info'\n    Exception: value"
+        )
+
 
 
 class ZopeSAXParseExceptionTests(unittest.TestCase):
+    maxDiff = None
 
     def _getTargetClass(self):
         from zope.configuration.xmlconfig import ZopeSAXParseException
@@ -52,12 +58,16 @@ class ZopeSAXParseExceptionTests(unittest.TestCase):
         return self._getTargetClass()(*args, **kw)
 
     def test___str___not_a_sax_error(self):
-        zxce = self._makeOne(Exception('Not a SAX error'))
-        self.assertEqual(str(zxce), "Not a SAX error")
+        zxce = self._makeOne("info", Exception('Not a SAX error'))
+        self.assertEqual(
+            str(zxce),
+            "info\n    Exception: Not a SAX error")
 
     def test___str___w_a_sax_error(self):
-        zxce = self._makeOne(Exception('filename.xml:24:32:WAAA'))
-        self.assertEqual(str(zxce), 'File "filename.xml", line 24.32, WAAA')
+        zxce = self._makeOne("info", Exception('filename.xml:24:32:WAAA'))
+        self.assertEqual(
+            str(zxce),
+            'info\n    Exception: filename.xml:24:32:WAAA')
 
 
 class ParserInfoTests(unittest.TestCase):
@@ -385,7 +395,7 @@ class Test_processxmlfile(unittest.TestCase):
         registerCommonDirectives(context)
         with self.assertRaises(ZopeSAXParseException) as exc:
             self._callFUT(StringIO(), context)
-        self.assertEqual(str(exc.exception._v),
+        self.assertEqual(str(exc.exception.evalue),
                          '<string>:1:0: no element found')
 
     def test_w_valid_xml_fp(self):

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
3.7
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi @ file:///croot/certifi_1671487769961/work/certifi
exceptiongroup==1.2.2
importlib-metadata==6.7.0
iniconfig==2.0.0
packaging==24.0
pluggy==1.2.0
pytest==7.4.4
tomli==2.0.1
typing_extensions==4.7.1
zipp==3.15.0
-e git+https://github.com/zopefoundation/zope.configuration.git@7c98fbbc5b1b864ce76ef235c8152054eaf6b96f#egg=zope.configuration
zope.event==5.0
zope.i18nmessageid==6.1.0
zope.interface==6.4.post2
zope.schema==7.0.1

name: zope.configuration
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - exceptiongroup==1.2.2
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - packaging==24.0
      - pluggy==1.2.0
      - pytest==7.4.4
      - tomli==2.0.1
      - typing-extensions==4.7.1
      - zipp==3.15.0
      - zope-event==5.0
      - zope-i18nmessageid==6.1.0
      - zope-interface==6.4.post2
      - zope-schema==7.0.1
prefix: /opt/conda/envs/zope.configuration

src/zope/configuration/tests/test_config.py::Test_toargs::test_w_field_missing_no_default src/zope/configuration/tests/test_config.py::Test_toargs::test_w_invalid_value src/zope/configuration/tests/test_config.py::Test_resolveConflicts::test_configuration_conflict_error_has_readable_exception src/zope/configuration/tests/test_xmlconfig.py::ZopeXMLConfigurationErrorTests::test___str___uses_repr_of_info src/zope/configuration/tests/test_xmlconfig.py::ZopeSAXParseExceptionTests::test___str___not_a_sax_error src/zope/configuration/tests/test_xmlconfig.py::ZopeSAXParseExceptionTests::test___str___w_a_sax_error src/zope/configuration/tests/test_xmlconfig.py::Test_processxmlfile::test_w_empty_xml
src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_action_defaults_no_info_no_includepath src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_action_defaults_w_info_w_includepath src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_action_explicit_no_extra src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_action_explicit_w_extra src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_checkDuplicate_hit src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_checkDuplicate_miss src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_hasFeature_hit src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_hasFeature_miss src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_path_expand_filenames src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_path_expand_user src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_path_w_absolute_filename src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_path_w_relative_filename_w_basepath src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_path_w_relative_filename_wo_basepath_wo_package src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_path_wo_basepath_w_package_having_file src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_path_wo_basepath_w_package_having_no_file_but_path src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_processFile_hit src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_processFile_miss src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_provideFeature src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_bad_dotted_import src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_bad_dotted_last_import src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_bad_sub_import src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_bad_sub_last_import src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_builtin src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_dot src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_empty src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_relative_miss_no_package src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_relative_miss_w_package_too_many_dots src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_single_non_builtin src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_trailing_dot_in_resolve src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_unicode_all src/zope/configuration/tests/test_config.py::ConfigurationContextTests::test_resolve_whitespace src/zope/configuration/tests/test_config.py::ConfigurationAdapterRegistryTests::test_ctor src/zope/configuration/tests/test_config.py::ConfigurationAdapterRegistryTests::test_document_non_string_name src/zope/configuration/tests/test_config.py::ConfigurationAdapterRegistryTests::test_document_w_string_name src/zope/configuration/tests/test_config.py::ConfigurationAdapterRegistryTests::test_factory_hit_on_fqn src/zope/configuration/tests/test_config.py::ConfigurationAdapterRegistryTests::test_factory_hit_on_fqn_lookup_fails src/zope/configuration/tests/test_config.py::ConfigurationAdapterRegistryTests::test_factory_miss src/zope/configuration/tests/test_config.py::ConfigurationAdapterRegistryTests::test_factory_miss_on_fqn_hit_on_bare_name src/zope/configuration/tests/test_config.py::ConfigurationAdapterRegistryTests::test_register src/zope/configuration/tests/test_config.py::ConfigurationAdapterRegistryTests::test_register_new_name src/zope/configuration/tests/test_config.py::ConfigurationAdapterRegistryTests::test_register_replacement src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test___call__ src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_begin_w___data_and_kw src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_begin_w___data_no_kw src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_begin_wo___data_w_kw src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_class_conforms_to_IConfigurationContext src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_ctor src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_end src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_execute_actions_empty src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_execute_actions_w_errors_custom src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_execute_actions_w_errors_w_testing src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_execute_actions_w_errors_wo_testing src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_execute_actions_w_errors_wo_testing_BaseException src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_execute_actions_w_errors_wo_testing_KeyboardInterrupt src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_execute_actions_w_errors_wo_testing_SystemExit src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_execute_actions_wo_errors src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_getInfo_only_root src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_getInfo_only_root_default src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_getInfo_w_item src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_instance_conforms_to_IConfigurationContext src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_keyword_handling src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_setInfo_only_root src/zope/configuration/tests/test_config.py::ConfigurationMachineTests::test_setInfo_w_item src/zope/configuration/tests/test_config.py::SimpleStackItemTests::test_class_conforms_to_IStackItem src/zope/configuration/tests/test_config.py::SimpleStackItemTests::test_contained_raises src/zope/configuration/tests/test_config.py::SimpleStackItemTests::test_ctor src/zope/configuration/tests/test_config.py::SimpleStackItemTests::test_finish_handler_returns_newstyle_actions src/zope/configuration/tests/test_config.py::SimpleStackItemTests::test_finish_handler_returns_no_actions src/zope/configuration/tests/test_config.py::SimpleStackItemTests::test_finish_handler_returns_oldstyle_actions src/zope/configuration/tests/test_config.py::SimpleStackItemTests::test_instance_conforms_to_IStackItem src/zope/configuration/tests/test_config.py::RootStackItemTests::test_class_conforms_to_IStackItem src/zope/configuration/tests/test_config.py::RootStackItemTests::test_contained_context_factory_fails src/zope/configuration/tests/test_config.py::RootStackItemTests::test_contained_context_factory_normal src/zope/configuration/tests/test_config.py::RootStackItemTests::test_finish src/zope/configuration/tests/test_config.py::RootStackItemTests::test_instance_conforms_to_IStackItem src/zope/configuration/tests/test_config.py::GroupingStackItemTests::test_class_conforms_to_IStackItem src/zope/configuration/tests/test_config.py::GroupingStackItemTests::test_contained_context_before_returns_newstyle_actions src/zope/configuration/tests/test_config.py::GroupingStackItemTests::test_contained_context_before_returns_oldstyle_actions src/zope/configuration/tests/test_config.py::GroupingStackItemTests::test_finish_calls_before_if_not_already_called src/zope/configuration/tests/test_config.py::GroupingStackItemTests::test_instance_conforms_to_IStackItem src/zope/configuration/tests/test_config.py::ComplexStackItemTests::test_class_conforms_to_IStackItem src/zope/configuration/tests/test_config.py::ComplexStackItemTests::test_contained_hit src/zope/configuration/tests/test_config.py::ComplexStackItemTests::test_contained_miss src/zope/configuration/tests/test_config.py::ComplexStackItemTests::test_ctor src/zope/configuration/tests/test_config.py::ComplexStackItemTests::test_finish_handler_is_noncallable src/zope/configuration/tests/test_config.py::ComplexStackItemTests::test_finish_handler_raises_AE_for___call__ src/zope/configuration/tests/test_config.py::ComplexStackItemTests::test_finish_handler_raises_AE_for_other src/zope/configuration/tests/test_config.py::ComplexStackItemTests::test_finish_handler_returns_newstyle_actions src/zope/configuration/tests/test_config.py::ComplexStackItemTests::test_finish_handler_returns_oldstyle_actions src/zope/configuration/tests/test_config.py::ComplexStackItemTests::test_instance_conforms_to_IStackItem src/zope/configuration/tests/test_config.py::GroupingContextDecoratorTests::test_after src/zope/configuration/tests/test_config.py::GroupingContextDecoratorTests::test_before src/zope/configuration/tests/test_config.py::GroupingContextDecoratorTests::test_class_conforms_to_IConfigurationContext src/zope/configuration/tests/test_config.py::GroupingContextDecoratorTests::test_class_conforms_to_IGroupingContext src/zope/configuration/tests/test_config.py::GroupingContextDecoratorTests::test_ctor_no_kwargs src/zope/configuration/tests/test_config.py::GroupingContextDecoratorTests::test_ctor_w_kwargs src/zope/configuration/tests/test_config.py::GroupingContextDecoratorTests::test_getattr_fetches_from_context_and_caches src/zope/configuration/tests/test_config.py::GroupingContextDecoratorTests::test_instance_conforms_to_IConfigurationContext src/zope/configuration/tests/test_config.py::GroupingContextDecoratorTests::test_instance_conforms_to_IGroupingContext src/zope/configuration/tests/test_config.py::DirectivesHandlerTests::test_class_conforms_to_IDirectivesContext src/zope/configuration/tests/test_config.py::DirectivesHandlerTests::test_instance_conforms_to_IDirectivesContext src/zope/configuration/tests/test_config.py::Test_defineSimpleDirective::test_defaults src/zope/configuration/tests/test_config.py::Test_defineSimpleDirective::test_explicit_w_star_namespace src/zope/configuration/tests/test_config.py::Test_defineGroupingDirective::test_defaults src/zope/configuration/tests/test_config.py::Test_defineGroupingDirective::test_explicit_w_star_namespace src/zope/configuration/tests/test_config.py::ComplexDirectiveDefinitionTests::test_before src/zope/configuration/tests/test_config.py::ComplexDirectiveDefinitionTests::test_class_conforms_to_IComplexDirectiveContext src/zope/configuration/tests/test_config.py::ComplexDirectiveDefinitionTests::test_instance_conforms_to_IComplexDirectiveContext src/zope/configuration/tests/test_config.py::Test_subdirective::test_w_handler_attribute src/zope/configuration/tests/test_config.py::Test_subdirective::test_wo_handler_attribute src/zope/configuration/tests/test_config.py::Test_provides::test_w_multiple src/zope/configuration/tests/test_config.py::Test_provides::test_w_single src/zope/configuration/tests/test_config.py::Test_toargs::test_w_empty_schema_no_data src/zope/configuration/tests/test_config.py::Test_toargs::test_w_empty_schema_w_data_no_kwargs_allowed src/zope/configuration/tests/test_config.py::Test_toargs::test_w_empty_schema_w_data_w_kwargs_allowed src/zope/configuration/tests/test_config.py::Test_toargs::test_w_field_missing_but_default src/zope/configuration/tests/test_config.py::Test_toargs::test_w_keyword_sub src/zope/configuration/tests/test_config.py::Test_expand_action::test_defaults src/zope/configuration/tests/test_config.py::Test_expand_action::test_explicit_no_extra src/zope/configuration/tests/test_config.py::Test_expand_action::test_explicit_w_extra src/zope/configuration/tests/test_config.py::Test_resolveConflicts::test_empty src/zope/configuration/tests/test_config.py::Test_resolveConflicts::test_expands_oldstyle_actions src/zope/configuration/tests/test_config.py::Test_resolveConflicts::test_w_non_resolvable_discriminator_clash_different_paths src/zope/configuration/tests/test_config.py::Test_resolveConflicts::test_w_non_resolvable_discriminator_clash_same_path src/zope/configuration/tests/test_config.py::Test_resolveConflicts::test_w_resolvable_discriminator_clash src/zope/configuration/tests/test_config.py::Test_resolveConflicts::test_wo_discriminator_clash src/zope/configuration/tests/test_config.py::Test_resolveConflicts::test_wo_discriminators_final_sorting_order src/zope/configuration/tests/test_xmlconfig.py::ParserInfoTests::test___repr___w_eline_ecolumn_dont_match_line_column src/zope/configuration/tests/test_xmlconfig.py::ParserInfoTests::test___repr___w_eline_ecolumn_match_line_column src/zope/configuration/tests/test_xmlconfig.py::ParserInfoTests::test___str___w_eline_ecolumn_dont_match_line_column_bad_file src/zope/configuration/tests/test_xmlconfig.py::ParserInfoTests::test___str___w_eline_ecolumn_match_line_column src/zope/configuration/tests/test_xmlconfig.py::ParserInfoTests::test___str___w_good_file src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_ctor_defaults src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_ctor_explicit src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_endElementNS_context_end_raises_BaseException src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_endElementNS_context_end_raises_w_testing src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_endElementNS_context_end_raises_wo_testing src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_endElementNS_normal src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_endElementNS_w_ignore_depth_already_set src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_have_hit src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_have_miss src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_have_no_args src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_installed_hit src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_installed_miss src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_installed_no_args src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_not_have_hit src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_not_have_miss src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_not_have_too_many_args src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_not_installed_hit src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_not_installed_miss src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_not_installed_too_many_args src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_evaluateCondition_w_unknown_verb src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_setDocumentLocator src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_startElementNS_context_begin_raises_BaseException src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_startElementNS_context_begin_raises_w_testing src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_startElementNS_context_begin_raises_wo_testing src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_startElementNS_normal src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_startElementNS_w_ignore_depth_already_set src/zope/configuration/tests/test_xmlconfig.py::ConfigurationHandlerTests::test_startElementNS_w_zcml_condition_failing src/zope/configuration/tests/test_xmlconfig.py::Test_processxmlfile::test_w_valid_xml_fp src/zope/configuration/tests/test_xmlconfig.py::Test_openInOrPlain::test_file_missing_and_dot_in_not_present src/zope/configuration/tests/test_xmlconfig.py::Test_openInOrPlain::test_file_missing_but_dot_in_present src/zope/configuration/tests/test_xmlconfig.py::Test_openInOrPlain::test_file_present src/zope/configuration/tests/test_xmlconfig.py::Test_include::test_both_file_and_files_passed src/zope/configuration/tests/test_xmlconfig.py::Test_include::test_neither_file_nor_files_passed src/zope/configuration/tests/test_xmlconfig.py::Test_include::test_neither_file_nor_files_passed_already_seen src/zope/configuration/tests/test_xmlconfig.py::Test_include::test_w_file_passed src/zope/configuration/tests/test_xmlconfig.py::Test_include::test_w_files_passed_and_package src/zope/configuration/tests/test_xmlconfig.py::Test_exclude::test_both_file_and_files_passed src/zope/configuration/tests/test_xmlconfig.py::Test_exclude::test_neither_file_nor_files_passed src/zope/configuration/tests/test_xmlconfig.py::Test_exclude::test_w_file_passed src/zope/configuration/tests/test_xmlconfig.py::Test_exclude::test_w_files_passed_and_package src/zope/configuration/tests/test_xmlconfig.py::Test_exclude::test_w_subpackage src/zope/configuration/tests/test_xmlconfig.py::Test_includeOverrides::test_actions_have_parents_includepath src/zope/configuration/tests/test_xmlconfig.py::Test_file::test_w_execute src/zope/configuration/tests/test_xmlconfig.py::Test_file::test_wo_execute_w_context src/zope/configuration/tests/test_xmlconfig.py::Test_file::test_wo_execute_wo_context_w_package src/zope/configuration/tests/test_xmlconfig.py::Test_file::test_wo_execute_wo_context_wo_package src/zope/configuration/tests/test_xmlconfig.py::Test_string::test_w_execute src/zope/configuration/tests/test_xmlconfig.py::Test_string::test_wo_execute_w_context src/zope/configuration/tests/test_xmlconfig.py::Test_string::test_wo_execute_wo_context src/zope/configuration/tests/test_xmlconfig.py::XMLConfigTests::test___call__ src/zope/configuration/tests/test_xmlconfig.py::XMLConfigTests::test_ctor src/zope/configuration/tests/test_xmlconfig.py::XMLConfigTests::test_ctor_w_global_context_missing src/zope/configuration/tests/test_xmlconfig.py::XMLConfigTests::test_ctor_w_module src/zope/configuration/tests/test_xmlconfig.py::Test_xmlconfig::test_w_testing_passed src/zope/configuration/tests/test_xmlconfig.py::Test_xmlconfig::test_wo_testing_passed src/zope/configuration/tests/test_xmlconfig.py::Test_testxmlconfig::test_w_testing_passed
src/zope/configuration/exceptions.py src/zope/configuration/config.py docs/narr.rst src/zope/configuration/xmlconfig.py CHANGES.rst
src/zope/configuration/exceptions.py src/zope/configuration/config.py docs/narr.rst src/zope/configuration/xmlconfig.py CHANGES.rst