Anyhow para Rust: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução ao Anyhow: o que é e para que serve

\n\n

Anyhow é uma das bibliotecas mais populares para tratamento de erros no ecossistema Rust. Ela fornece uma maneira simples, flexível e conveniente de trabalhar com erros, especialmente em situações onde você não precisa de tipagem estrita de erros ou quando está escrevendo protótipos, scripts, utilitários CLI ou aplicações onde a velocidade de desenvolvimento é mais importante do que o tratamento perfeito de cada variante de erro.

\n\n

Na biblioteca padrão do Rust, o tratamento de erros é construído em torno do tipo Result<T, E>, onde E é o tipo de erro. No entanto, em projetos grandes, os tipos de erro podem ser diferentes: std::io::Error, serde_json::Error, reqwest::Error, etc. Combiná-los manualmente é uma tarefa não trivial. Anyhow resolve esse problema fornecendo um tipo universal anyhow::Error, que pode armazenar qualquer erro que implemente a trait std::error::Error.

\n\n

Principais vantagens do Anyhow:

\n
    \n
  • Simplicidade: Mínimo de código boilerplate. Você não precisa criar seus próprios tipos de erro para cada módulo.
  • \n
  • Flexibilidade: Qualquer erro é automaticamente convertido para anyhow::Error.
  • \n
  • Contexto: Você pode adicionar informações extras ao erro usando o método .context().
  • \n
  • Macros convenientes: bail! e ensure! permitem retornar erros rapidamente.
  • \n
  • Compatibilidade: Funciona com qualquer biblioteca que retorne Result.
  • \n
\n\n

Anyhow não é destinado para bibliotecas (onde é melhor usar thiserror), mas é ideal para aplicações, binários e testes.

\n\n

Instalação

\n\n

Anyhow é uma biblioteca para Rust, portanto a instalação é feita através do gerenciador de pacotes cargo. Adicione a seguinte linha ao seu arquivo Cargo.toml:

\n\n
[dependencies]\nanyhow = "1.0"
\n\n

Depois disso, execute o comando cargo build, e a biblioteca será baixada e compilada. Se você estiver usando Rust 2021 edition ou superior, nenhuma configuração adicional é necessária.

\n\n

Para trabalhar com Anyhow no código, basta importá-la:

\n\n
use anyhow::{Result, anyhow, bail, Context};
\n\n

Início rápido: primeiro exemplo

\n\n

Vamos escrever um programa simples que lê um arquivo, faz o parsing como JSON e exibe o resultado. Se ocorrer um erro em qualquer etapa, simplesmente o retornamos para cima.

\n\n
use anyhow::Result;\nuse std::fs;\n\nfn main() -> Result<()> {\n    // Lê o conteúdo do arquivo\n    let data = fs::read_to_string("config.json")?;\n    \n    // Faz o parsing como JSON (usa serde_json)\n    let config: serde_json::Value = serde_json::from_str(&data)?;\n    \n    println!("Configuração: {}", config);\n    Ok(())\n}
\n\n

Observe o ? — o operador de propagação de erro. Se read_to_string ou from_str retornarem um erro, ele será automaticamente convertido para anyhow::Error e a função terminará com esse erro. Simples e elegante.

\n\n

Principais métodos e funções do Anyhow

\n\n

Abaixo estão 10 métodos e funções principais da biblioteca Anyhow com descrição detalhada e exemplos.

\n\n

1. anyhow!() — criação de erro arbitrário

\n

O que faz: A macro anyhow! cria um novo erro do tipo anyhow::Error a partir de uma string ou mensagem formatada. É análogo ao format!, mas para erros.

\n

Parâmetros: Aceita uma string com formatação (como format!) ou qualquer tipo que implemente Display.

\n

Exemplo:

\n
use anyhow::{anyhow, Result};\n\nfn validate_age(age: i32) -> Result<()> {\n    if age < 0 {\n                    

Recommendations