Como a linguagem Rust garante que erros em tempo de execução sejam tratados

Elemar Júnior

Rust adota uma abordagem extremamente elegante para garantir que erros em tempo de execução sejam tratados, impedindo, inclusive, que o um programa compile caso não se atenda as expectativas do compilador.

Para demonstrar essa elegância, façamos um comparativo breve com uma linguagem bem conhecida: C#.

Qual é o problema com a forma como C# lida com erros em tempo de execução

Pense, por um momento, em um método em C# para recuperar um registro no banco de dados. Como seria a assinatura deste método? Algo assim?

public Customer GetById(int id)
{
  // ..
}

Pois bem. Considere:

  • Qual seria o retorno dessa função caso o id especificado não esteja no banco de dados? null? Um exception?
  • O que deveria ocorrer caso houvesse um problema de conexão com o banco? Essa função deveria lançar uma exception? Caso essa exception não seja tratada, tudo bem se seu programa cair?
  • O que ocorre caso o runtime não consiga memória para alocar o objeto de retorno? OutOfMemoryException, certo? Você sabia que não há forma de seu programa se recuperar caso isso aconteça?

Como pode ver, temos três tipos de erros diferentes que podem ocorrer e nenhuma indicação explícita disso na assinatura do método. Essa falta de expressividade é uma das características que menos nos agrada na linguagem C#.

Rust não tem null nem exceptions

Rust rompe com a forma como programadores C# (e Java) estão acostumados a expressar erros. Não há null nem exceptions. Aliás, essa é uma característica recorrente em linguagens com forte influência funcional (caso de Rust).

Em Rust, sempre que um erro “tratável” acontecer ele poderá ser “retornado” pela função onde este erro ocorreu.

Aliás, falando em erros “tratáveis”, precisamos entender que Rust segrega erros em duas categorias:

  1. erros que o programa consegue tratar e continuar funcionando;
  2. erros que o programa não consegue tratar e que devem encerrar sua execução imediatamente.

Funções que podem retornar erros que o programa consegue tratar retornam uma enumeração Result<T, E>, onde T é o tipo do retorno em caso de sucesso e é o tipo do retorno em caso de erro.

A mesma função que escrevemos em C#, em Rust poderia ter uma assinatura assim:

fn getCustomerById(id: i32) -> Result<Customer, String> {
  // ..
}

Implicações:

  • A assinatura dessa função indica claramente que um erro pode acontecer e, que, caso um erro ocorra uma string será retornada (provavelmente com uma mensagem explicando erro).
  • Não há maneira de acessar o retorno da função sem implementar algum tratamento para erros potenciais.
  • Caso um erro irrecuperável ocorra, o programa será encerrado sem que tenhamos que implementar qualquer tratamento. Afinal, esse tratamento serviria de nada.

Como usar o retorno de funções que podem gerar erros

O compilador de Rust gera warnings sempre que um Result<T, E> é retornado mas não é utilizado.

O uso padrão do retorno ocorre, geralmente, através de pattern matching (outra característica recorrente de linguagens com influência funcional).

Vejamos um exemplo:

use std::fs::File;

fn main() {
    let f = File::open("hello.txt");

    let f = match f {
        Ok(file) => file,
        Err(error) => {
            panic!("There was a problem opening the file: {:?}", error)
        },
    };
}

No exemplo acima, tentamos ler um arquivo. A função File::open retorna Result. Em caso de erro, a chamada a macro panic! dispara um erro que forçará o encerramento da execução.

Como entender mais sobre erros em Rust?

Mais uma vez, o livro The Rust Programming Language (disponível on-line) é uma excelente referência e é leitura mais do que recomendada. No caso de tratamento de erros, em Rust, recomendamos a leitura do capítulo Error Handling.

Era isso… por enquanto

Neste post mostramos a elegância de Rust usando como referência outra linguagem que amamos: C#.

A forma como Rust lida com erros não é, de forma alguma, original. Outras linguagens com influência funcional seguem a mesma ideia. Entretanto, a consistência e a expressividade de Rust reforçadas por seu compilador, ajuda na escrita de programas com menos chances de erros em tempo de execução.

Gostou? Deixe sua opinião nos comentários.

Compartilhe este insight:

Comentários

Participe deixando seu comentário sobre este artigo a seguir:

Subscribe
Notify of
guest
0 Comentários
Inline Feedbacks
View all comments

AUTOR

Elemar Júnior
Fundador e CEO da EximiaCo atua como tech trusted advisor ajudando empresas e profissionais a gerar mais resultados através da tecnologia.

NOVOS HORIZONTES PARA O SEU NEGÓCIO

Nosso time está preparado para superar junto com você grandes desafios tecnológicos.

Entre em contato e vamos juntos utilizar a tecnologia do jeito certo para gerar mais resultados.

Insights EximiaCo

Confira os conteúdos de negócios e tecnologia desenvolvidos pelos nossos consultores:

Arquitetura de Dados

Insights de um DBA na análise de um plano de execução

Especialista em performance de Bancos de Dados de larga escala
Arquitetura de Software

Estratégias para modernização do legado

Desenvolvedor .NET/NodeJs e especialista em Kafka com experiência em startups e grandes empresas
Infraestrutura e Nuvem

Migração para a nuvem, mais do que mudança tecnológica, implica em mudança da cultura organizacional

Engenheiro de nuvem, arquiteto de software e especialista em Containers e Devops

Acesse nossos canais

Simplificamos, potencializamos e aceleramos resultados usando a tecnologia do jeito certo

EximiaCo 2022 – Todos os direitos reservados

0
Queremos saber a sua opinião, deixe seu comentáriox
()
x

Como a linguagem Rust garante que erros em tempo de execução sejam tratados

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Condição especial de pré-venda: R$ 14.000,00 - contratando a mentoria até até 31/01/2023 e R$ 15.000,00 - contratando a mentoria a partir de 01/02/2023, em até 12x com taxas.

Tenho interesse nessa capacitação

Para solicitar mais informações sobre essa capacitação para a sua empresa, preencha o formulário a seguir:

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

O seu insight foi excluído com sucesso!

O seu insight foi excluído e não está mais disponível.

O seu insight foi salvo com sucesso!

Ele está na fila de espera, aguardando ser revisado para ter sua publicação programada.

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse nessa solução

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse neste serviço

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

× Precisa de ajuda?