2016-02-22 11 views
7

sto usando panic::catch_unwind per la cattura di un panico:Soppressione panico uscita a Rust quando si utilizza il panico :: 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)

Questo sembra funzionare bene, ma sto ancora ricevendo l'uscita del panico sullo stdout. Vorrei questo per stampare solo:

caught panic! 

Invece di

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

risposta

8

È necessario registrare un gancio antipanico con std::panic::set_hook che non fa nulla. È quindi possibile catturare con 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!"), 
    } 
} 

Come Matthieu M. notes, è possibile ottenere il gancio corrente con std::panic::take_hook al fine di ripristinare in seguito, se è necessario.

+2

Nota: è possibile utilizzare 'take_handler' prima per poter ripristinare il gestore originale dopo il ripristino. –

0

È possibile utilizzare std::panic::set_hook per sopprimere l'uscita. Si noti tuttavia che l'hook è globale a livello di processo e sopprimerà i report su a tutti i panico che potrebbero verificarsi all'interno del programma.

Come già plugged nella mia risposta a una domanda simile, ho scritto una cassa che fornisce un modo per sopprimere il gancio con filtri componibili, incluso uno che funziona su una base per thread.

Problemi correlati