Fix error handling in tui.loop
This commit is contained in:
parent
213a223861
commit
d19f9e5b96
@ -111,8 +111,8 @@ class UnhandledException(Handler):
|
|||||||
def initialize(self, screen_size, quit_loop, wakeup):
|
def initialize(self, screen_size, quit_loop, wakeup):
|
||||||
Handler.initialize(self, screen_size, quit_loop, wakeup)
|
Handler.initialize(self, screen_size, quit_loop, wakeup)
|
||||||
self.write(clear_screen())
|
self.write(clear_screen())
|
||||||
self.write(self.tb)
|
self.write(self.tb.replace('\n', '\r\n'))
|
||||||
self.write('\n')
|
self.write('\r\n')
|
||||||
self.write('Press the Enter key to quit')
|
self.write('Press the Enter key to quit')
|
||||||
|
|
||||||
def on_key(self, key_event):
|
def on_key(self, key_event):
|
||||||
@ -167,6 +167,9 @@ class Loop:
|
|||||||
self.handler = handler
|
self.handler = handler
|
||||||
try:
|
try:
|
||||||
self.read_buf = self.parse_input_from_terminal(self.read_buf, self.in_bracketed_paste)
|
self.read_buf = self.parse_input_from_terminal(self.read_buf, self.in_bracketed_paste)
|
||||||
|
except Exception:
|
||||||
|
self.read_buf = ''
|
||||||
|
raise
|
||||||
finally:
|
finally:
|
||||||
del self.handler
|
del self.handler
|
||||||
|
|
||||||
@ -287,7 +290,7 @@ class Loop:
|
|||||||
|
|
||||||
def _modify_output_selector(self, waiting_for_write):
|
def _modify_output_selector(self, waiting_for_write):
|
||||||
if waiting_for_write:
|
if waiting_for_write:
|
||||||
self.sel.register(self.output_fd, selectors.EVENT_WRITE)
|
self.sel.register(self.output_fd, selectors.EVENT_WRITE, self._write_ready)
|
||||||
else:
|
else:
|
||||||
self.sel.unregister(self.output_fd)
|
self.sel.unregister(self.output_fd)
|
||||||
|
|
||||||
@ -301,7 +304,8 @@ class Loop:
|
|||||||
signal.signal(signal.SIGINT, self._on_sigint)
|
signal.signal(signal.SIGINT, self._on_sigint)
|
||||||
handler.write_buf = []
|
handler.write_buf = []
|
||||||
handler.initialize(screen_size(), self.quit, self.wakeup)
|
handler.initialize(screen_size(), self.quit, self.wakeup)
|
||||||
while True:
|
keep_going = True
|
||||||
|
while keep_going:
|
||||||
has_data_to_write = bool(handler.write_buf)
|
has_data_to_write = bool(handler.write_buf)
|
||||||
if not has_data_to_write and not self.read_allowed:
|
if not has_data_to_write and not self.read_allowed:
|
||||||
break
|
break
|
||||||
@ -316,6 +320,7 @@ class Loop:
|
|||||||
import traceback
|
import traceback
|
||||||
tb = traceback.format_exc()
|
tb = traceback.format_exc()
|
||||||
self.return_code = 1
|
self.return_code = 1
|
||||||
|
keep_going = False
|
||||||
break
|
break
|
||||||
if tb is not None:
|
if tb is not None:
|
||||||
self._report_error_loop(tb)
|
self._report_error_loop(tb)
|
||||||
|
|||||||
@ -27,7 +27,8 @@ parse_input_from_terminal(PyObject *self UNUSED, PyObject *args) {
|
|||||||
} \
|
} \
|
||||||
if (num > 0) { \
|
if (num > 0) { \
|
||||||
PyObject *ret = PyObject_CallFunction(fcb, "N", PyUnicode_Substring(uo, s, s + num)); \
|
PyObject *ret = PyObject_CallFunction(fcb, "N", PyUnicode_Substring(uo, s, s + num)); \
|
||||||
Py_XDECREF(ret); \
|
if (ret == NULL) return NULL; \
|
||||||
|
Py_DECREF(ret); \
|
||||||
} \
|
} \
|
||||||
consumed = s_ + num_; \
|
consumed = s_ + num_; \
|
||||||
count = 0; \
|
count = 0; \
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user