From 23f22906b343400a2ebab5373d443d5e065b8138 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 17 Apr 2019 19:38:55 +0530 Subject: [PATCH] py3: Fix failure in Unhandled exception handler --- src/calibre/gui2/main_window.py | 4 ++-- src/polyglot/io.py | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/main_window.py b/src/calibre/gui2/main_window.py index d8a3ad83f2..03a93d8913 100644 --- a/src/calibre/gui2/main_window.py +++ b/src/calibre/gui2/main_window.py @@ -6,13 +6,13 @@ __copyright__ = '2008, Kovid Goyal ' import sys, gc, weakref -from io import BytesIO from PyQt5.Qt import (QMainWindow, QTimer, QAction, QMenu, QMenuBar, QIcon, QObject) from calibre.utils.config import OptionParser from calibre.gui2 import error_dialog from calibre import prints, force_unicode, as_unicode +from polyglot.io import PolyglotBytesIO def option_parser(usage='''\ @@ -135,7 +135,7 @@ class MainWindow(QMainWindow): return import traceback try: - sio = BytesIO() + sio = PolyglotBytesIO(errors='replace') try: from calibre.debug import print_basic_debug_info print_basic_debug_info(out=sio) diff --git a/src/polyglot/io.py b/src/polyglot/io.py index 7eefb12135..c5dcfe23ed 100644 --- a/src/polyglot/io.py +++ b/src/polyglot/io.py @@ -9,27 +9,29 @@ from io import StringIO, BytesIO class PolyglotStringIO(StringIO): - def __init__(self, initial_data=None, encoding='utf-8'): + def __init__(self, initial_data=None, encoding='utf-8', errors='strict'): StringIO.__init__(self) self._encoding_for_bytes = encoding + self._errors = errors if initial_data is not None: self.write(initial_data) def write(self, x): if isinstance(x, bytes): - x = x.decode(self._encoding_for_bytes) + x = x.decode(self._encoding_for_bytes, errors=self._errors) StringIO.write(self, x) class PolyglotBytesIO(BytesIO): - def __init__(self, initial_data=None, encoding='utf-8'): + def __init__(self, initial_data=None, encoding='utf-8', errors='strict'): BytesIO.__init__(self) self._encoding_for_bytes = encoding + self._errors = errors if initial_data is not None: self.write(initial_data) def write(self, x): if not isinstance(x, bytes): - x = x.encode(self._encoding_for_bytes) + x = x.encode(self._encoding_for_bytes, errors=self._errors) BytesIO.write(self, x)