From 55a9e88dc97a6fef14f03962b076c4a4b2422f32 Mon Sep 17 00:00:00 2001 From: Damian Lokic Date: Wed, 28 Jan 2026 11:45:36 +0100 Subject: [PATCH 1/3] T291934: Add changelog --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ab141df..93d6a31 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,9 @@ +23.3.0 +====== + +- Modify the ``afterfail_error_message`` to skip error logging + if the Zope request will be retried (by Zope automatically) + 23.2.0 ====== From ae12b1c41acc4edae55c4644339d9d900cff458c Mon Sep 17 00:00:00 2001 From: Damian Lokic Date: Wed, 28 Jan 2026 11:47:06 +0100 Subject: [PATCH 2/3] T291934: Skip logging for retried Zope requests --- Products/PerFactErrors/errors.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Products/PerFactErrors/errors.py b/Products/PerFactErrors/errors.py index 8bd2ee1..bd03af6 100644 --- a/Products/PerFactErrors/errors.py +++ b/Products/PerFactErrors/errors.py @@ -5,6 +5,7 @@ import zExceptions.ExceptionFormatter from zExceptions import Unauthorized from zope.pagetemplate.pagetemplate import PTRuntimeError +from transaction.interfaces import TransientError try: from ZPublisher.HTTPRequest import WSGIRequest @@ -26,11 +27,13 @@ def afterfail_error_message(event): """ req = event.request context = req['PARENTS'][0] - render = getattr(context, 'afterfail_error_message_', None) - if render is None: - return try: error_type, error_value, error_tb = event.exc_info + render = getattr(context, 'afterfail_error_message_', None) + retry = isinstance(error_value, TransientError) and req.supports_retry() + if render is None and not retry: + return + # With WSGI, the error traceback itself no longer is printed to the # event.log, so we do that manually - except for special cases log_error = ( From 6ad0572ac5ccba9e1c598571d71589066f789f37 Mon Sep 17 00:00:00 2001 From: Damian Lokic Date: Tue, 10 Mar 2026 11:52:02 +0100 Subject: [PATCH 3/3] T291934: Fix condition --- Products/PerFactErrors/errors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Products/PerFactErrors/errors.py b/Products/PerFactErrors/errors.py index bd03af6..19c06fa 100644 --- a/Products/PerFactErrors/errors.py +++ b/Products/PerFactErrors/errors.py @@ -31,7 +31,7 @@ def afterfail_error_message(event): error_type, error_value, error_tb = event.exc_info render = getattr(context, 'afterfail_error_message_', None) retry = isinstance(error_value, TransientError) and req.supports_retry() - if render is None and not retry: + if render is None or retry: return # With WSGI, the error traceback itself no longer is printed to the