Есть какой-либо способ сделать это? В графической библиотеке терминала, если возникает исключение, исключение будет сброшено перед отображением, что затрудняет отладку программирования с использованием этой библиотеки.
impl Drop for Terminal {
fn drop(&mut self) {
self.outbuffer.write_all(&self.driver.get(DevFn::ShowCursor)).unwrap();
self.outbuffer.write_all(&self.driver.get(DevFn::Reset)).unwrap();
self.outbuffer.write_all(&self.driver.get(DevFn::Clear)).unwrap();
self.outbuffer.write_all(&self.driver.get(DevFn::ExitCa)).unwrap();
self.flush().unwrap(); // If an exception occurs, this will reclear the screen and remove the output
self.termctl.reset().unwrap();
SIGWINCH_STATUS.store(false, Ordering::SeqCst);
RUSTTY_STATUS.store(false, Ordering::SeqCst);
}
}
Если бы я закомментировал self.flush().unwrap();
, исключение было бы напечатано, однако терминал не смог бы правильно очистить экран и оставить графику на терминале даже после завершения программы.
Можно ли в начале программы указать настраиваемый буфер, который паника будет использовать для записи? Или, может быть, написать для этого хитрый трюк? Таким образом, после сброса мы можем проверить, есть ли что-нибудь внутри этого буфера, если это так, мы знаем, что произошло исключение, и можем его распечатать.
Запуск программы, которая намеренно дает сбой из-за арифметического переполнения, в настоящее время выводится только
Однако, комментируя self.flush().unwrap();
, мы встречаемся с фактическим исключением, но теперь очень уродливым терминалом. Это решение не будет работать, так как программа, которая выполняется правильно, все равно должна быть очищена, поскольку не требуется отображать ошибку.