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étodo | Comportamento |
|---|---|
.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