py3: Fix failure in Unhandled exception handler

This commit is contained in:
Kovid Goyal 2019-04-17 19:38:55 +05:30
parent 116ef1cc4d
commit 23f22906b3
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 8 additions and 6 deletions

View File

@ -6,13 +6,13 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
import sys, gc, weakref import sys, gc, weakref
from io import BytesIO
from PyQt5.Qt import (QMainWindow, QTimer, QAction, QMenu, QMenuBar, QIcon, from PyQt5.Qt import (QMainWindow, QTimer, QAction, QMenu, QMenuBar, QIcon,
QObject) QObject)
from calibre.utils.config import OptionParser from calibre.utils.config import OptionParser
from calibre.gui2 import error_dialog from calibre.gui2 import error_dialog
from calibre import prints, force_unicode, as_unicode from calibre import prints, force_unicode, as_unicode
from polyglot.io import PolyglotBytesIO
def option_parser(usage='''\ def option_parser(usage='''\
@ -135,7 +135,7 @@ class MainWindow(QMainWindow):
return return
import traceback import traceback
try: try:
sio = BytesIO() sio = PolyglotBytesIO(errors='replace')
try: try:
from calibre.debug import print_basic_debug_info from calibre.debug import print_basic_debug_info
print_basic_debug_info(out=sio) print_basic_debug_info(out=sio)

View File

@ -9,27 +9,29 @@ from io import StringIO, BytesIO
class PolyglotStringIO(StringIO): 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) StringIO.__init__(self)
self._encoding_for_bytes = encoding self._encoding_for_bytes = encoding
self._errors = errors
if initial_data is not None: if initial_data is not None:
self.write(initial_data) self.write(initial_data)
def write(self, x): def write(self, x):
if isinstance(x, bytes): 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) StringIO.write(self, x)
class PolyglotBytesIO(BytesIO): 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) BytesIO.__init__(self)
self._encoding_for_bytes = encoding self._encoding_for_bytes = encoding
self._errors = errors
if initial_data is not None: if initial_data is not None:
self.write(initial_data) self.write(initial_data)
def write(self, x): def write(self, x):
if not isinstance(x, bytes): 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) BytesIO.write(self, x)