Tratamento de Erros
Abordagens Comuns de Tratamento de Erros em Aplicações Rust
O tratamento de erros em Rust difere de linguagens como Java; ele não possui construções como try...catch. A abordagem típica é definir um tipo de erro global no nível da aplicação:
Aqui, a biblioteca thiserror é utilizada, facilitando a definição de tipos de erro personalizados e simplificando o código. Para concisão, também é definido um alias de tipo AppResult.
thiserror vs. anyhow
No ecossistema de tratamento de erros do Rust, duas bibliotecas comumente usadas são thiserror e anyhow:
-
thiserror: Adequada para desenvolvedores de bibliotecas definirem tipos de erro claros. Ela usa macros derive para ajudar a implementar a trait
std::error::Errorpara tipos de erro personalizados, permitindo que você defina representações de erro. Ao construir uma biblioteca ou fornecer tipos de erro claros aos usuários,thiserroré a melhor escolha. -
anyhow: Voltada para desenvolvedores de aplicações, fornece um tipo de erro genérico
anyhow::Errorque pode encapsular qualquer erro que implemente a traitstd::error::Error. Foca mais na propagação do erro do que na definição, tornando-a particularmente adequada para código de camada de aplicação. Você pode converter rapidamente vários erros emanyhow::Error, reduzindo a necessidade de código repetitivo.
Em alguns cenários, você pode usar ambas as bibliotecas: definir tipos de erro com thiserror em bibliotecas e lidar e propagar esses erros com anyhow em aplicações.
Tratamento de Erros em Handlers
No Salvo, Handlers frequentemente encontram vários erros, como erros de conexão com banco de dados, erros de acesso a arquivos, erros de conexão de rede, etc. Para esses tipos de erros, a abordagem de tratamento de erros mencionada anteriormente pode ser aplicada:
Aqui, home retorna diretamente um AppResult<()>. Mas como esse erro deve ser exibido? Precisamos implementar a trait Writer para o tipo de erro personalizado AppResult, onde podemos decidir como exibir o erro:
No Salvo, um Handler pode retornar um Result, desde que tanto o tipo Ok quanto o tipo Err no Result implementem a trait Writer.
Tratamento de Erros com anyhow
Dado o uso generalizado do anyhow, o Salvo fornece suporte embutido para anyhow::Error. Quando o recurso anyhow está habilitado, anyhow::Error implementa a trait Writer e é mapeado para InternalServerError:
Para usar o recurso anyhow, habilite o recurso anyhow do Salvo em Cargo.toml:
Isso permite que suas funções handler retornem diretamente anyhow::Result<T>:
Erros frequentemente contêm informações sensíveis, que geralmente não devem ser visíveis para usuários comuns por motivos de segurança e privacidade. No entanto, se você for um desenvolvedor ou administrador do site, pode preferir que os erros sejam totalmente expostos, revelando as informações de erro mais precisas.
Como mostrado, no método write, podemos acessar referências a Request e Depot, tornando conveniente implementar a abordagem acima:
Exibindo Páginas de Erro
As páginas de erro embutidas do Salvo atendem aos requisitos na maioria dos casos, exibindo páginas Html, Json ou Xml com base no tipo de dados da solicitação. No entanto, há situações em que ainda se deseja exibir páginas de erro personalizadas.
Isso pode ser alcançado implementando um Catcher personalizado. Para instruções detalhadas, consulte a seção Catcher.