Result
Nosso mecanismo primĂĄrio para tratamento de erros em Rust Ă© o enum Result
, que vimos brevemente ao discutir tipos da biblioteca padrĂŁo.
use std::fs::File; use std::io::Read; fn main() { let file: Result<File, std::io::Error> = File::open("diary.txt"); match file { Ok(mut file) => { let mut contents = String::new(); if let Ok(bytes) = file.read_to_string(&mut contents) { println!("Querido diĂĄrio: {contents} ({bytes} bytes)"); } else { println!("NĂŁo foi possĂvel ler o conteĂșdo do arquivo"); } } Err(err) => { println!("NĂŁo foi possĂvel abrir o diĂĄrio: {err}"); } } }
-
Result
tem duas variantes:Ok
que contém o valor de sucesso, eErr
que contém um valor de erro de algum tipo. -
Se uma função pode ou não produzir um erro é codificado na assinatura de tipo da função, fazendo-a retornar um valor
Result
. -
Assim como com
Option
, nĂŁo hĂĄ como esquecer de lidar com um erro: vocĂȘ nĂŁo pode acessar nem o valor de sucesso nem o valor de erro sem primeiro corresponder a um padrĂŁo noResult
para verificar qual variante vocĂȘ tem. MĂ©todos comounwrap
facilitam a escrita de cĂłdigo rĂĄpido e sujo que nĂŁo faz um tratamento de erros robusto, mas significa que vocĂȘ sempre pode ver em seu cĂłdigo-fonte onde o tratamento de erros adequado estĂĄ sendo ignorado.
Mais para Explorar
Pode ser Ăștil comparar o tratamento de erros em Rust com convençÔes de tratamento de erros com as quais os alunos podem estar familiarizados de outras linguagens de programação.
ExceçÔes
-
Muitas linguagens usam exceçÔes, por exemplo, C++, Java, Python.
-
Na maioria das linguagens com exceçÔes, se uma função pode ou nĂŁo lançar uma exceção nĂŁo Ă© visĂvel como parte de sua assinatura de tipo. Isso geralmente significa que vocĂȘ nĂŁo pode dizer ao chamar uma função se ela pode lançar uma exceção ou nĂŁo.
-
ExceçÔes geralmente desmontam a pilha de chamadas, propagando-se para cima até que um bloco
try
seja alcançado. Um erro originado profundamente na pilha de chamadas pode impactar uma função não relacionada mais acima.
NĂșmeros de Erro
-
Algumas linguagens tĂȘm funçÔes que retornam um nĂșmero de erro (ou algum outro valor de erro) separadamente do valor de retorno bem-sucedido da função. Exemplos incluem C e Go.
-
Dependendo da linguagem, pode ser possĂvel esquecer de verificar o valor de erro, caso em que vocĂȘ pode estar acessando um valor de sucesso nĂŁo inicializado ou de outra forma invĂĄlido.