Skip to main content

expect | Rust

  • expect | Rust

O que é .expect() em Rust

O método .expect() é usado em valores dos tipos Option<T> e Result<T, E> para extrair o valor interno, encerrando o programa com um erro personalizado caso o valor seja None ou Err.


Uso com Option<T>

Quando aplicado a um Option, .expect() retorna o valor se for Some, ou provoca um pânico se for None.

let nome: Option<&str> = Some("Elemar");
let resultado = nome.expect("Esperava um nome válido");

Se nome for None, o programa exibirá a mensagem definida:

thread 'main' panicked at 'Esperava um nome válido', src/main.rs:line:column

Uso com Result<T, E>

Quando aplicado a um Result, .expect() retorna o valor se for Ok, ou provoca pânico se for Err.

use std::fs::File;

let arquivo = File::open("dados.txt")
.expect("Não foi possível abrir o arquivo");

Se a abertura falhar, será exibido:

thread 'main' panicked at 'Não foi possível abrir o arquivo: <detalhes do erro>'

Diferença entre .expect() e .unwrap()

MétodoComportamento
.unwrap()Pânico com mensagem genérica
.expect()Pânico com mensagem personalizada

.expect() fornece mais contexto de erro, facilitando o diagnóstico durante o desenvolvimento.


Quando usar .expect()

  • Durante testes ou prototipagem rápida
  • Quando o erro indica um estado irrecuperável
  • Ao validar pré-condições que nunca devem falhar

Evite em produção quando o erro puder ser tratado de forma mais segura com:

match resultado {
Ok(valor) => { /* usa valor */ }
Err(e) => { /* trata erro */ }
}

Ou com propagação de erro:

fn carregar() -> Result<(), std::io::Error> {
let _arquivo = File::open("dados.txt")?;
Ok(())
}

Exemplo comparativo

fn main() {
let op: Option<&str> = None;

// Isso causará pânico com mensagem:
let valor = op.expect("Valor esperado, mas estava ausente");
}

Considerações finais sobre .expect()

  • Preferível em desenvolvimento, não em produção
  • Pode ajudar no diagnóstico rápido de erros
  • Permite mensagens customizadas em falhas críticas