C'è più di un modo per gestire gli errori in Rust, quindi assicurati di considerare tutte le opzioni.

Gli errori sono inevitabili e possono verificarsi per vari motivi, dall'input dell'utente non valido a errori di rete, malfunzionamenti hardware o bug di programmazione. La gestione degli errori è il processo di rilevamento, segnalazione e ripristino da tali errori per prevenire arresti anomali del programma o danneggiamento dei dati.

Una gestione efficace degli errori è fondamentale in Rust. Consente di creare applicazioni robuste e affidabili in grado di gestire errori e guasti imprevisti. I meccanismi di gestione degli errori di Rust ti consentono di sviluppare programmi resilienti e sicuri che sono più facili da mantenere.

I tipi di errori in Rust

Rust ha un ricco sistema di tipi che puoi usare per gestire gli errori in modo competente, secondo i loro tipi. I vantaggi del ricco sistema di tipo di errore di Rust rispetto ai tradizionali approcci di gestione degli errori non possono essere sottovalutati. Il sistema del tipo di errore fornisce

instagram viewer
migliorata sicurezza del tipo, componibilità, espressività e debugging.

Ecco un elenco di tipi di errore comuni in Rust:

  • IL std:: io:: Errore type rappresenta errori di I/O come file non trovato, autorizzazione negata o fine del file raggiunta.
  • IL std:: num:: ParseIntError type rappresenta gli errori che si verificano durante le operazioni di analisi da stringa a numero intero.
  • IL std:: opzione:: NessunoErrore type rappresenta gli errori derivanti dall'apertura delle opzioni vuote.
  • IL std:: risultato:: Risultato type è un tipo di risultato generico che è possibile utilizzare per rappresentare qualsiasi errore.

Ogni tipo di errore ha il proprio set di metodi e tratti per gestirlo in modi specifici.

Ecco un esempio di gestione degli errori in Rust per un'operazione di lettura di file:

utilizzo std:: fs:: File;
utilizzo std:: io:: Leggi;

fnleggi_file(sentiero: &str) -> Risultato<Corda, std:: io:: Errore> {
permetteremut file = File:: apri (percorso)?;
permetteremut contenuto = Corda::nuovo();
file.read_to_string(&mut Contenuti)?;
OK(Contenuti)
}

IL leggi_file La funzione legge il contenuto del file nel percorso specificato e lo restituisce come stringa. Restituisce un std:: io:: Errore se l'operazione di apertura o lettura del file non riesce. IL ? L'operatore propaga l'errore e restituisce l'errore come a Risultato.

Meccanismi di gestione degli errori in Rust

Una caratteristica chiave che contribuisce alla sicurezza di Rust è il suo meccanismo di gestione degli errori. Ci sono quattro principali meccanismi di gestione degli errori in Rust: il Risultato digitare il Opzione digitare il panico! macro e il Errore tratto.

I tipi Risultato e Opzione consentono una gestione strutturata degli errori. Puoi usare il panico! macro per gestire errori irreversibili. Il tratto Error ti consente di definire i tipi di errore personalizzati e la gestione degli errori personalizzati.

Il tipo di risultato

IL Risultato type è un tipo incorporato che rappresenta il risultato di un'operazione che può fallire. Ha due varianti: il OK variante, che rappresenta il successo e contiene un valore, e Err, che rappresenta un errore e contiene un valore di errore.

Ecco come puoi utilizzare il tipo Risultato per aprire un file e leggerne il contenuto:

utilizzo std:: fs:: File;
utilizzo std:: io:: preludio::*;

fnleggi_file(percorso del file: &str) -> Risultato<Corda, std:: io:: Errore> {
permetteremut file = File:: apri (percorso_file)?;
permetteremut contenuto = Corda::nuovo();
file.read_to_string(&mut Contenuti)?;
OK(Contenuti)
}

fnprincipale() {
permettere risultato = read_file("file.txt");

incontro risultato {
OK(contenuto) => stampa!("{}", Contenuti),
Err(e) => stampa!("Errore: {}", e),
}
}

IL leggi_file la funzione accetta il percorso del file e restituisce a Risultato errore. Se l'operazione di lettura o apertura del file non riesce, la funzione restituisce il file Err valore. In caso contrario, la funzione restituisce il OK valore. Nel principale funzione, il incontro istruzione gestisce il Risultato valore e stampa il risultato in base alla situazione dell'operazione sul file.

Il tipo di opzione

IL Opzione type è un tipo integrato che rappresenta la presenza o l'assenza di un valore. IL Opzione tipo ha due varianti. Alcuni rappresenta un valore, e Nessuno rappresenta l'assenza di un valore.

Ecco come puoi usare il Opzione digitare per recuperare il primo elemento di un vettore.

fnget_first_elementClone>(vec: Vec) -> Opzione {
Se vec.è_vuoto() {
Nessuno
} altro {
Alcuni(vec.first().unwrap().clone())
}
}

fnprincipale() {
permettere vec = vec![1, 2, 3];
permettere risultato = get_first_element (vec);

incontro risultato {
Alcuni(elemento) => stampa!("{}", elemento),
Nessuno => stampa!("Il vettore è vuoto."),
}
}

IL get_first_element funzione restituisce un Opzione tipo. Se il vettore è vuoto, la funzione restituisce Nessuno; altrimenti, la funzione ritorna Alcuni contenente il primo elemento del vettore. Nel principale funzione, il incontro istruzione gestisce il Opzione valore. Se la Opzione valuta a Alcuni, la funzione stampa il primo elemento. In caso contrario, la funzione stampa un messaggio che indica che il vettore è vuoto.

Il panico! Macro

IL panico! macro fornisce funzionalità per la gestione di errori irreversibili in Rust. Chiamando il panico! macro, stampa un messaggio di errore e termina il programma.

Ecco un esempio di utilizzo del panico! macro per indicare che una funzione ha argomenti non validi.

fndividere(dividendo: f64, divisore: f64) -> f64 {
Se divisore == 0.0 {
panico!("Il divisore non può essere zero.");
}

dividendo/divisore
}

fnprincipale() {
permettere risultato = dividere(4.0, 0.0);
stampa!("{}", risultato);
}

IL dividere la funzione controlla se il divisore è zero; se il divisore è zero, la funzione chiama the panico! macro con un messaggio di errore; in caso contrario, la funzione calcola e restituisce il risultato

IL principale La funzione chiama la funzione di divisione con argomenti non validi per attivare il panico! macro.

Ecco il messaggio di errore:

Il tratto dell'errore

IL Errore trait è un tratto integrato che definisce il comportamento dei tipi di errore. IL Errore trait fornisce funzionalità per la definizione di tipi di errore personalizzati e la gestione degli errori personalizzati.

Ecco un esempio di definizione di un tipo di errore personalizzato che rappresenta un errore di file non trovato.

utilizzo std:: errore:: errore;
utilizzo std:: fmt;
utilizzo std:: io:: Leggi;

#[derivare (debug)]
structFile non trovato(Corda);

imp fmt:: Visualizza per File non trovato {
fnfmt(&se stesso, F: &mut fmt:: Formattatore) -> fmt::Risultato {
scrivere!(F, "File non trovato: {}", se stesso.0)
}
}

imp Errore per File non trovato {}

fnleggi_file(percorso del file: &str) -> Risultato<Corda, Scatola<din Errore >> {
permetteremut file = std:: fs:: File:: open (file_path).map_err(|e| FileNotFound(formato!("{}", e)))?;
permetteremut contenuto = Corda::nuovo();
file.read_to_string(&mut Contenuti)?;
OK(Contenuti)
}

fnprincipale() {
permettere risultato = read_file("file.txt");

incontro risultato {
OK(contenuto) => stampa!("{}", Contenuti),
Err(e) => stampa!("Errore: {}", e),
}
}

Il tipo di errore personalizzato è il File non trovato struct. Il tipo contiene un percorso file e il file File non trovato type implementa il Schermo trait per restituire messaggi di errore intuitivi e il file Errore tratto per indicare che si tratta di un tipo di errore.

Nel leggi_file funzione, il File non trovato il tipo di errore rappresenta un errore di file non trovato e il map_err Il metodo converte l'errore std:: io:: in un errore FileNotFound. Finalmente, la scatola type consente alla funzione di restituire qualsiasi tipo che implementa il tratto Error.

IL principale funzione chiama il leggi_file function con il percorso del file e, se trova il file, ne stampa il contenuto sulla console. In caso contrario, stampa il messaggio di errore.

Ecco il risultato per un file che non esiste:

Puoi contare sul modello di proprietà di Rust per la sicurezza del programma

Insieme al magnifico meccanismo di gestione degli errori di Rust, Rust utilizza anche un modello di proprietà che aiuta a garantire che i tuoi programmi siano protetti dalla memoria.

Rust garantisce le regole di proprietà con un controllo del prestito in fase di compilazione prima dell'esecuzione del programma.