2015-10-15 88 views
3

有什么办法可以防止生锈?在终端图形库中,如果当前发生异常,则在显示前异常将被刷新;使编程非常难以使用该库进行调试。将恐慌重定向到指定的缓冲区

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();异常将打印,但是终端将无法正确刷新屏幕,并使当前的程序结束后,即使在终端上的图形。

是否可以在程序开始时指定用于写入的自定义缓冲区恐慌?或者可能写一个黑客伎俩来做到这一点?这样,在刷新之后,我们可以检查是否有任何东西在这个缓冲区内,如果有的话,我们知道发生了异常并可以打印出来。


运行一个程序,故意用算术溢出崩溃,目前的产量只有 enter image description here

注释掉self.flush().unwrap();不过,我们欢迎与实际的异常,而是一个非常难看的终端现在。该解决方案将无法正常工作程序,正确执行,仍然需要,因为不需要错误显示

被刷新

enter image description here

+0

我怀疑有做到这一点的好办法,但也许这个功能将是有用的:https://doc.rust-lang.org/std/rt/unwind/fn.panicking.html – Adrian

+0

@阿德里安这是不稳定的想法;(。谢谢我会试一试 –

+1

这个不是不稳定的:https://doc.rust-lang.org/std/thread/fn.panickin g.html – Adrian

回答

2

恐慌的消息正在写入stderr所以哈克的方式做,这是重定向标准错误到一个文件(cargo run 2>/path/to/panic.log)。

或者,你可以在你的程序本身使用gag(免责声明,我写这个库)来做到这一点。不幸的是,它不适用于Windows。

下面将重定向标准错误,直到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... 

您也可以通过执行缓冲标准错误在临时文件:

use gag::BufferRedirect; 

let mut stderr_buffer = BufferRedirect::stderr().unwrap(); 
+0

这很好用!令人敬畏的图书馆,帮助您将头痛的stderr重定向带走 –