Jump through the hoops needed to ensure error reporting is done in case of early termination of kittens that use overlay ready notifications

This commit is contained in:
Kovid Goyal
2022-03-24 08:49:36 +05:30
parent c41405fd57
commit bfb8532c52
5 changed files with 36 additions and 23 deletions

View File

@@ -44,6 +44,7 @@ class Handler:
use_alternate_screen = True
mouse_tracking = MouseTracking.none
terminal_io_ended = False
overlay_ready_report_needed = False
def _initialize(
self,
@@ -219,7 +220,7 @@ class HandleResult:
def result_handler(
type_of_input: Optional[str] = None,
no_ui: bool = False,
has_ready_notification: bool = False
has_ready_notification: bool = Handler.overlay_ready_report_needed
) -> Callable[[Callable[..., Any]], HandleResult]:
def wrapper(impl: Callable[..., Any]) -> HandleResult:

View File

@@ -236,6 +236,7 @@ class Loop:
else:
self.asyncio_loop = asyncio.get_event_loop()
self.return_code = 0
self.overlay_ready_reported = False
self.optional_actions = optional_actions
self.read_buf = ''
self.decoder = codecs.getincrementaldecoder('utf-8')('ignore')
@@ -435,6 +436,8 @@ class Loop:
self.asyncio_loop.set_exception_handler(handle_exception)
handler._initialize(self._get_screen_size(), term_manager, schedule_write, self, debug, image_manager)
with handler:
if handler.overlay_ready_report_needed:
handler.cmd.overlay_ready()
self.asyncio_loop.add_reader(
tty_fd, self._read_ready, handler, tty_fd)
self.asyncio_loop.add_writer(
@@ -467,9 +470,12 @@ class Loop:
term_manager.extra_finalize = b''.join(self.write_buf).decode('utf-8')
if tb is not None:
report_overlay_ready = handler.overlay_ready_report_needed and not self.overlay_ready_reported
self.return_code = 1
if not handler.terminal_io_ended:
self._report_error_loop(tb, term_manager)
self._report_error_loop(tb, term_manager, report_overlay_ready)
def _report_error_loop(self, tb: str, term_manager: TermManager) -> None:
self.loop_impl(UnhandledException(tb), term_manager)
def _report_error_loop(self, tb: str, term_manager: TermManager, overlay_ready_report_needed: bool) -> None:
handler = UnhandledException(tb)
handler.overlay_ready_report_needed = overlay_ready_report_needed
self.loop_impl(handler, term_manager)

View File

@@ -48,3 +48,17 @@ def human_size(
from math import log
exponent = min(int(log(size, 1024)), len(unit_list) - 1)
return format_number(size / 1024**exponent, max_num_of_decimals) + sep + unit_list[exponent]
def report_unhandled_error(msg: str = '') -> None:
' Report an unhandled exception also sending the overlay ready message to ensure kitten is visible '
from .operations import overlay_ready
print(end=overlay_ready())
if msg:
print(msg, file=sys.stderr)
cls, e, tb = sys.exc_info()
if not isinstance(e, (SystemExit, KeyboardInterrupt)):
import traceback
traceback.print_exc()
input('Press Enter to quit.')
raise SystemExit(1)