From 0d38a2ea31dbbfa4299968383fc09cd99445501e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 10 Jan 2017 17:17:23 +0530 Subject: [PATCH] Ignore exceptions when printing error messages --- kitty/boss.py | 4 ++-- kitty/config.py | 12 ++++++------ kitty/main.py | 7 ++++--- kitty/terminfo.py | 10 +++++++++- kitty/timers.py | 3 ++- kitty/utils.py | 9 ++++++++- kitty/window.py | 8 ++++---- 7 files changed, 35 insertions(+), 18 deletions(-) diff --git a/kitty/boss.py b/kitty/boss.py index 1450daab6..cae0bd8d2 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -32,7 +32,7 @@ from .session import create_session from .shaders import Sprites, ShaderProgram from .tabs import TabManager, SpecialWindow from .timers import Timers -from .utils import handle_unix_signals +from .utils import handle_unix_signals, safe_print def conditional_run(w, i): @@ -145,7 +145,7 @@ class Boss(Thread): func(*args) except Exception: import traceback - traceback.print_exc() + safe_print(traceback.format_exc()) def add_child_fd(self, child_fd, read_ready, write_ready): self.read_dispatch_map[child_fd] = read_ready diff --git a/kitty/config.py b/kitty/config.py index ebe836f9e..433a7e4c7 100644 --- a/kitty/config.py +++ b/kitty/config.py @@ -14,7 +14,7 @@ from .fast_data_types import ( CURSOR_BLOCK, CURSOR_BEAM, CURSOR_UNDERLINE ) import kitty.fast_data_types as defines -from .utils import to_color +from .utils import to_color, safe_print from .layout import all_layouts from .constants import config_dir @@ -53,7 +53,7 @@ def parse_mods(parts): try: mods |= getattr(defines, 'GLFW_MOD_' + map_mod(m.upper())) except AttributeError: - print('Shortcut: {} has an unknown modifier, ignoring'.format(parts.join('+')), file=sys.stderr) + safe_print('Shortcut: {} has an unknown modifier, ignoring'.format(parts.join('+')), file=sys.stderr) return return mods @@ -75,7 +75,7 @@ def parse_key(val, keymap): key = parts[-1].upper() key = getattr(defines, 'GLFW_KEY_' + named_keys.get(key, key), None) if key is None: - print('Shortcut: {} has an unknown key, ignoring'.format(val), file=sys.stderr) + safe_print('Shortcut: {} has an unknown key, ignoring'.format(val), file=sys.stderr) return keymap[(mods, key)] = action @@ -194,7 +194,7 @@ def load_cached_values(): except FileNotFoundError: pass except Exception as err: - print('Failed to load cached values with error: {}'.format(err), file=sys.stderr) + safe_print('Failed to load cached values with error: {}'.format(err), file=sys.stderr) def save_cached_values(): @@ -204,11 +204,11 @@ def save_cached_values(): f.write(json.dumps(cached_values).encode('utf-8')) os.rename(p, cached_path) except Exception as err: - print('Failed to save cached values with error: {}'.format(err), file=sys.stderr) + safe_print('Failed to save cached values with error: {}'.format(err), file=sys.stderr) finally: try: os.remove(p) except FileNotFoundError: pass except Exception as err: - print('Failed to delete temp file for saved cached values with error: {}'.format(err), file=sys.stderr) + safe_print('Failed to delete temp file for saved cached values with error: {}'.format(err), file=sys.stderr) diff --git a/kitty/main.py b/kitty/main.py index 4d3641d3b..dc9b4487b 100644 --- a/kitty/main.py +++ b/kitty/main.py @@ -23,6 +23,7 @@ from .fast_data_types import ( glfw_set_error_callback, glfw_init, glfw_terminate, glfw_window_hint, glfw_swap_interval, glfw_wait_events, Window ) +from .utils import safe_print def option_parser(): @@ -78,7 +79,7 @@ def dispatch_pending_calls(boss): func(*args) except Exception: import traceback - traceback.print_exc() + safe_print(traceback.format_exc()) boss.ui_timers() @@ -90,7 +91,7 @@ def run_app(opts, args): try: viewport_size.width, viewport_size.height = map(int, ws) except Exception: - print('Invalid cached window size, ignoring', file=sys.stderr) + safe_print('Invalid cached window size, ignoring', file=sys.stderr) viewport_size.width = max(100, viewport_size.width) viewport_size.height = max(80, viewport_size.height) window = Window( @@ -120,7 +121,7 @@ def on_glfw_error(code, msg): msg = msg.decode('utf-8') except Exception: msg = repr(msg) - print('[glfw error] ', msg, file=sys.stderr) + safe_print('[glfw error] ', msg, file=sys.stderr) def main(): diff --git a/kitty/terminfo.py b/kitty/terminfo.py index 3cad53e83..2ba0da86f 100644 --- a/kitty/terminfo.py +++ b/kitty/terminfo.py @@ -5,6 +5,14 @@ import re from binascii import unhexlify, hexlify + +def safe_print(*a, **k): + try: + print(*a, **k) + except Exception: + pass + + names = 'xterm-kitty', 'KovIdTTY' termcap_aliases = { @@ -432,7 +440,7 @@ def get_capabilities(query_string): try: val = queryable_capabilities[termcap_aliases[name]] except Exception as e: - print(ERROR_PREFIX, 'Unknown terminfo property:', name) + safe_print(ERROR_PREFIX, 'Unknown terminfo property:', name) raise ans.append(q + '=' + hexlify(str(val))) return b'\033P1+r' + ';'.join(ans).encode('utf-8') + b'\033\\' diff --git a/kitty/timers.py b/kitty/timers.py index 050a18bd9..e4f3d5482 100644 --- a/kitty/timers.py +++ b/kitty/timers.py @@ -6,6 +6,7 @@ from collections import namedtuple from operator import itemgetter from time import monotonic +from .utils import safe_print Event = namedtuple('Event', 'at callback args') get_at = itemgetter(0) @@ -54,4 +55,4 @@ class Timers: ev.callback(*ev.args) except Exception: import traceback - traceback.print_exc() + safe_print(traceback.format_exc()) diff --git a/kitty/utils.py b/kitty/utils.py index 420390e9c..161debd72 100644 --- a/kitty/utils.py +++ b/kitty/utils.py @@ -23,6 +23,13 @@ wcwidth_native.argtypes = [ctypes.c_wchar] wcwidth_native.restype = ctypes.c_int +def safe_print(*a, **k): + try: + print(*a, **k) + except Exception: + pass + + @lru_cache(maxsize=2**13) def wcwidth(c: str) -> int: ans = min(2, wcwidth_native(c)) @@ -37,7 +44,7 @@ def timeit(name, do_timing=False): st = monotonic() yield if do_timing: - print('Time for {}: {}'.format(name, monotonic() - st)) + safe_print('Time for {}: {}'.format(name, monotonic() - st)) def sanitize_title(x): diff --git a/kitty/window.py b/kitty/window.py index 8f5f943c9..750642f14 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -20,7 +20,7 @@ from .fast_data_types import ( from .keys import key_map from .mouse import encode_mouse_event, PRESS, RELEASE, MOVE, DRAG from .terminfo import get_capabilities -from .utils import sanitize_title, get_primary_selection, parse_color_set +from .utils import sanitize_title, get_primary_selection, parse_color_set, safe_print class Window: @@ -322,13 +322,13 @@ class Window: if a[0] == 'draw': if a[1] is None: if self.draw_dump_buf: - print('draw', ''.join(self.draw_dump_buf)) + safe_print('draw', ''.join(self.draw_dump_buf)) self.draw_dump_buf = [] else: self.draw_dump_buf.append(a[1]) else: if self.draw_dump_buf: - print('draw', ''.join(self.draw_dump_buf)) + safe_print('draw', ''.join(self.draw_dump_buf)) self.draw_dump_buf = [] - print(*a) + safe_print(*a) # }}}