2016-02-22 9 views
7

ich panic::catch_unwind bin mit einer Panik zu fangen:Suppress Ausgang in Rust Panik, wenn Panik mit :: 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)

Diese ganz gut zu funktionieren scheint, aber ich bin immer noch immer die Ausgabe der Panik zu stdout. Ich würde dies nur gerne ausdrucken:

caught panic! 

Statt

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

Antwort

8

Sie benötigen einen Panikhaken mit std::panic::set_hook die nichts tut, registrieren. Sie können es dann fangen mit 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!"), 
    } 
} 

Als Matthieu M. notes, können Sie den aktuellen Haken mit std::panic::take_hook, um es wieder herzustellen danach bekommen können, wenn Sie benötigen.

+2

Hinweis: ein 'take_handler' zuerst den ursprünglichen Handler nach der Wiederherstellung wiederherstellen zu können, verwenden kann. –

0

können Sie std::panic::set_hook verwenden, um die Ausgabe zu unterdrücken. Beachten Sie jedoch, dass der Hook Prozess-global ist und die Berichterstattung über alle Panics unterdrückt, die innerhalb des Programms auftreten können.

Wie bereits plugged in meiner Antwort auf eine ähnliche Frage, habe ich eine Kiste geschrieben, die eine Möglichkeit bietet, den Haken mit zusammensetzbaren Filtern zu unterdrücken, einschließlich einer, die auf einer Pro-Thread-Basis funktioniert.

Verwandte Themen