2015-10-15 66 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重定向帶走 –