有没有办法做到这一点?在终端图形库中,如果发生异常,异常会在显示前被冲掉,使得使用该库进行编程调试非常困难。
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();
异常将打印,但是即使程序结束,终端也不会正确刷新屏幕并在终端上留下图形。是否可以在程序开始时指定用于写入的自定义缓冲区 panic ?或者可能写一个黑客技巧来做到这一点?这样,在刷新之后,我们可以检查该缓冲区中是否有任何内容,如果有,我们就知道发生了异常并可以将其打印出来。
运行一个故意因算术溢出而崩溃的程序,目前输出仅为
然而,通过注释掉
self.flush().unwrap();
,我们遇到了实际的异常,但现在是一个非常丑陋的终端。此解决方案将不起作用,因为正确执行的程序仍需要刷新,因为不需要显示错误最佳答案
Panics 消息当前被写入 stderr,因此执行此操作的hacky 方法是将 stderr 重定向到文件 ( cargo run 2>/path/to/panic.log
)。
或者,您可以使用 gag 在您的程序中完成此操作(免责声明,我编写了这个库)。不幸的是,它不适用于 Windows。
以下将重定向 stderr 直到 stderr_redirect
被删除:
use std::fs::OpenOptions;
use gag::Redirect;
let log = OpenOptions::new()
.truncate(true)
.read(true)
.create(true)
.write(true)
.open("/path/to/panic.log")
.unwrap();
let stderr_redirect = Redirect::stderr(log).unwrap();
// Your code here...
您还可以通过执行以下操作在临时文件中缓冲 stderr:
use gag::BufferRedirect;
let mut stderr_buffer = BufferRedirect::stderr().unwrap();
关于rust - 将 panic 重定向到指定的缓冲区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33151317/