2016-02-22 9 views
7

मैं panic::catch_unwind उपयोग कर रहा हूँ एक आतंक को पकड़ने के लिए उपयोग करते हुए जंग में उत्पादन आतंक:दबाने जब आतंक :: catch_unwind

use std::panic; 

fn main() { 
    let result = panic::catch_unwind(|| { 
     panic!("test panic"); 
    }); 

    match result { 
     Ok(res) => res, 
     Err(_) => println!("caught panic!"), 
    } 
} 

(Playground)

यह सिर्फ अच्छा काम करने लगता है, लेकिन मैं अभी भी हो रही है पैनिक के उत्पादन के लिए stdout। मुझे यह पसंद केवल प्रिंट चाहते हैं:

caught panic! 

इसके बजाय

की
thread '<main>' panicked at 'test panic', <anon>:6 
note: Run with `RUST_BACKTRACE=1` for a backtrace. 
caught panic! 

उत्तर

8

आप std::panic::set_hook कि कुछ नहीं करता है के साथ एक आतंक हुक रजिस्टर करने के लिए की जरूरत है। इसके बाद आप std::panic::catch_unwind साथ इसे पकड़ कर सकते हैं:

use std::panic; 

fn main() { 
    panic::set_hook(Box::new(|_info| { 
     // do nothing 
    })); 

    let result = panic::catch_unwind(|| { 
     panic!("test panic"); 
    }); 

    match result { 
     Ok(res) => res, 
     Err(_) => println!("caught panic!"), 
    } 
} 

Matthieu M. notes रूप में, आप वर्तमान हुक std::panic::take_hook साथ है ताकि इसे बाद में बहाल करने के लिए, आप की जरूरत है में मिल सकता है।

+2

नोट: कोई पुनर्प्राप्ति के बाद मूल हैंडलर को पुनर्स्थापित करने में सक्षम होने के लिए पहले 'take_handler' का उपयोग कर सकता है। –

0

आउटपुट को दबाने के लिए आप std::panic::set_hook का उपयोग कर सकते हैं। ध्यान दें कि हुक प्रक्रिया-वैश्विक है और यह प्रोग्राम के भीतर होने वाले सभी पैनिक्स पर रिपोर्टिंग को दबाएगा।

इसी तरह के प्रश्न के उत्तर में पहले से ही plugged जैसा कि मैंने एक क्रेट लिखा है जो प्रति-थ्रेड आधार पर काम करने वाले एक सहित समेकित फ़िल्टर के साथ हुक को दबाने का एक तरीका प्रदान करता है।

संबंधित मुद्दे