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}");
        }
    }
}
This slide should take about 5 minutes.
  • Result tem duas variantes: Ok que contĂ©m o valor de sucesso, e Err 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 no Result para verificar qual variante vocĂȘ tem. MĂ©todos como unwrap 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.