diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py
index 29babd7bf6996a..d851b93af1f563 100644
--- a/Lib/test/test_sax.py
+++ b/Lib/test/test_sax.py
@@ -25,6 +25,7 @@
from urllib.error import URLError
import urllib.request
from test.support import os_helper
+from test import support
from test.support import findfile, check__all__
from test.support.os_helper import FakePath, TESTFN
@@ -1055,6 +1056,32 @@ def test_expat_entityresolver_default(self):
self.assertEqual(result.getvalue(), start +
b"")
+ @support.subTests("exc_type", [KeyboardInterrupt, SystemExit, ValueError])
+ def test_external_entity_parser_with_exceptions(self, exc_type):
+ # gh-148427: BaseException subclasses must propagate, not be swallowed
+ def raise_on_entity(name, attrs):
+ if name == 'entity':
+ raise exc_type("test")
+
+ handler = mock.Mock()
+ handler.startElement = raise_on_entity
+
+ parser = create_parser()
+ parser.setFeature(feature_external_ges, True)
+ parser.setEntityResolver(self.TestEntityResolver())
+ parser.setContentHandler(handler)
+
+ parser.feed('\n')
+ parser.feed(']>\n')
+ trigger = '&test;'
+
+ if issubclass(exc_type, Exception):
+ self.assertRaises(SAXParseException, parser.feed, trigger)
+ else:
+ with self.assertRaisesRegex(exc_type, "test"):
+ parser.feed(trigger)
+
# ===== Attributes support
class AttrGatherer(ContentHandler):
diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py
index 37b1add2848487..54c768f96bdb1a 100644
--- a/Lib/xml/sax/expatreader.py
+++ b/Lib/xml/sax/expatreader.py
@@ -424,7 +424,7 @@ def external_entity_ref(self, context, base, sysid, pubid):
try:
xmlreader.IncrementalParser.parse(self, source)
- except:
+ except Exception:
return 0 # FIXME: save error info here?
(self._parser, self._source) = self._entity_stack[-1]
diff --git a/Misc/NEWS.d/next/Library/2026-04-12-09-52-14.gh-issue-148427.xR7v3m.rst b/Misc/NEWS.d/next/Library/2026-04-12-09-52-14.gh-issue-148427.xR7v3m.rst
new file mode 100644
index 00000000000000..4f941c68ec9278
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-04-12-09-52-14.gh-issue-148427.xR7v3m.rst
@@ -0,0 +1,3 @@
+Fix bare ``except`` clause in :mod:`xml.sax` Expat's external entity
+handler that silently swallowed :exc:`BaseException` instances such
+as :exc:`KeyboardInterrupt`.