Issue #15343: A lot more than just unicode decoding can go wrong when retrieving a source file
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index ee39a31..780928a 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -845,12 +845,21 @@
path = self.get_filename(fullname)
try:
source_bytes = self.get_data(path)
- except IOError:
+ except IOError as exc:
raise ImportError("source not available through get_data()",
- name=fullname)
- encoding = tokenize.detect_encoding(_io.BytesIO(source_bytes).readline)
+ name=fullname) from exc
+ readsource = _io.BytesIO(source_bytes).readline
+ try:
+ encoding = tokenize.detect_encoding(readsource)
+ except SyntaxError as exc:
+ raise ImportError("Failed to detect encoding",
+ name=fullname) from exc
newline_decoder = _io.IncrementalNewlineDecoder(None, True)
- return newline_decoder.decode(source_bytes.decode(encoding[0]))
+ try:
+ return newline_decoder.decode(source_bytes.decode(encoding[0]))
+ except UnicodeDecodeError as exc:
+ raise ImportError("Failed to decode source file",
+ name=fullname) from exc
def get_code(self, fullname):
"""Concrete implementation of InspectLoader.get_code.
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index 4aa48e5..5d63ffa 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -2048,7 +2048,7 @@
if hasattr(loader, 'get_source'):
try:
source = loader.get_source(modname)
- except UnicodeDecodeError:
+ except Exception:
if onerror:
onerror(modname)
continue