2016-03-27 8 views
1

Es gibt Tonnen von Artikeln über die Fehlerbehandlung in Rust, aber alle scheinen dazu zu führen, dass ein Fehlerobjekt zurückgegeben wird, was eine Panik oder etwas ähnliches verursacht.Wie schreibe ich die Signatur einer Funktion, die einen Fehler anzeigt und das Programm beendet?

Ich möchte Benutzereingabe für einen Fehler überprüfen, also kann ich es nicht nur um den Stapel überliefern, und ich kann nicht einfach in Panik (es ist kaum benutzerfreundlich)

Derzeit bin ich ein leeres if let mit mit einem else Block, um dies zu handhaben, aber es scheint hässlich und peinlich. Gibt es in den Bergen der Bequemlichkeitsmethoden in Option und Result nichts, was es mir erlaubt, eine endgültige Methode aufzurufen?

unwrap_or_else nur beschwert, dass der Wert der Schließung der falsche Typ ist.

use std::io::{stderr, Write}; 
use std::env; 
use std::process::exit; 

fn error_out(e: &str) { 
    writeln!(&mut stderr(), "{}", e).expect(format!("Failed to print error: {}", e).as_str()); 
    exit(1); 
} 

fn main() { 
    if let Some(filename) = env::args().nth(1) {} else { 
     error_out("No filename provided"); 
    }; 
} 

Antwort

2

Sie können den Rückgabetyp ! zu error_out hinzufügen, um anzuzeigen, dass er nicht zurückkommt. Dann ist sein Typ egal und es ist OK, es in unwrap_or_else zu benennen:

use std::process::exit; 

fn error_out(e: &str) -> ! { 
    writeln!(&mut stderr(), "{}", e).expect(format!("Failed to print error: {}", e).as_str()); 
    exit(1); 
} 

fn main() { 
    let filename: String = env::args().nth(1).unwrap_or_else(|| error_out("No filename provided")); 
    println!("{}", filename); 
} 
+0

Minor Nit: '!' Ist kein Typ; Es ist etwas, das Sie * anstelle * eines Rückgabetyps verwenden können. –

Verwandte Themen