Derivando Enums de Erro
O crate thiserror Ă© uma maneira popular de criar um tipo enumerado (enum) de erro, como fizemos na pĂĄgina anterior:
use std::{fs, io}; use std::io::Read; use thiserror::Error; #[derive(Debug, Error)] enum LerNomeUsuarioErro { #[error("NĂŁo Ă© possivel ler: {0}")] ErroES(#[from] io::Error), #[error("Nome de usuĂĄrio nĂŁo encontrado em {0}")] NomeUsuarioVazio(String), } fn ler_nome_usuario(caminho: &str) -> Result<String, LerNomeUsuarioErro> { let mut nome_usuario = String::new(); fs::File::open(caminho)?.read_to_string(&mut nome_usuario)?; if nome_usuario.is_empty() { return Err(LerNomeUsuarioErro::NomeUsuarioVazio(String::from(caminho))); } Ok(nome_usuario) } fn main() { //fs::write("config.dat", "").unwrap(); match ler_nome_usuario("config.dat") { Ok(nome_usuario) => println!("Nome do usuĂĄrio: {nome_usuario}"), Err(err) => println!("Erro: {err}"), } }
A derive macro thiserror
implementa automaticamente std::error::Error
, e opcionalmente, Display
(se os atributos #[error(...)]
forem fornecidos) e From
(se o atributo #[from]
for adicionado). Também funciona para structs.
NĂŁo afeta sua API pĂșblica, o que a torna boa para bibliotecas.