No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
Lição 31: Propagação de Erros (Operador ?)
1. Narrativa
No sistema do mecha Æther, falhas podem ocorrer em cascata — um sensor inativo impede a leitura, que impede a calibragem, que impede a inicialização. O operador ? propaga erros automaticamente pela cadeia de chamadas, permitindo que o piloto escreva código limpo sem tratar cada falha individualmente.
2. Conceito
Propagação de erros com ? e From trait:
- Operador
?: DesempacotaOk(v)ou retornaErr(e)antecipadamente Fromtrait: Conversão automática entre tipos de erro viaimpl From<ErrA> for ErrB- Encadeamento: Múltiplos
?em sequência — cada um pode falhar map_err: Converte erro manualmente quandoFromnão está implementado- Combinação Option/Result:
?funciona em ambos —Nonepropaga comoNone
3. Requisitos
- Usar
?para propagar erros em funções que retornamResult - Implementar
Frompara conversão automática de erros - Encadear múltiplas operações com
? - Combinar
OptioneResultcom propagação
4. Design de Dados
graph LR
A["parse: ErroParse"] -->|"From"| B["ErroSubsistema::DadoCorrompido"]
C["limite excedido"] --> D["ErroSubsistema::TemperaturaCritica"]
E["energia baixa"] --> F["ErroSubsistema::EnergiaInsuficiente"]
G["? operator"] --> H["Propaga ErroSubsistema automaticamente"]
5. Diagrama de Fluxo
flowchart TD
A[Início] --> B["ler_valor(dado)?"]
B --> C{Parse OK?}
C -->|Não| D["Err(DadoCorrompido) ← retorna"]
C -->|Sim| E["calibrar(valor, limite)?"]
E --> F{Valor > limite?}
F -->|Sim| G["Err(TemperaturaCritica) ← retorna"]
F -->|Não| H["Ok(valor)"]
H --> I["inicializar_mecha(energia?, temp?, pressao?)"]
I --> J{Todas OK?}
J -->|Não| K["Propaga erro via ?"]
J -->|Sim| L["Ok(Mech operacional)"]
6. Funções
| Função | Descrição |
|---|---|
encontrar_sensor |
Busca sensor por ID no HashMap → Option |
ler_valor_inteiro |
Parse string com map_err e From |
calibrar_sensor |
Parse + verificação de limite com ? |
iniciar_reator |
Valida temperatura e pressão encadeadas |
verificar_piloto |
Busca piloto por ID → Option |
diagnosticar_sistema |
Diagnóstico motor + escudo com ? |
inicializar_mecha |
Validação completa: energia + temp + pressão |
7. Exemplo
fn calibrar_sensor(dado: &str, limite: i32) -> Result<i32, ErroSubsistema> {
let valor = dado.parse().map_err(ErroSubsistema::from)?;
if valor > limite {
Err(ErroSubsistema::TemperaturaCritica)
} else {
Ok(valor)
}
}
8. Missão
- Entender o enum
ErroSubsistemae a implementação deFrom<ParseIntError> - Implementar
encontrar_sensoreverificar_pilotocomOption - Implementar
ler_valor_inteirocommap_err+ conversão - Implementar
calibrar_sensorcom?encadeado - Implementar
iniciar_reatorcom validação múltipla - Implementar
diagnosticar_sistemacom early returns - Implementar
inicializar_mechacom encadeamento completo
Limiares de Validação (contrato)
Os limites abaixo são exigidos pelos testes — memorize-os:
| Sistema | Limite seguro | Limite crítico | Erro retornado |
|---|---|---|---|
| Temperatura | ≤ 500 | > 500 (ex.: 1200) | TemperaturaCritica |
| Pressão | ≤ 300 | > 300 (ex.: 600) | PressaoCritica |
| Energia | ≥ 500 | < 500 (ex.: 50) | EnergiaInsuficiente |
calibrar_sensor(dado, limite)retornaTemperaturaCriticase o valor parseado for maior que olimitepassado.diagnosticar_sistema(dado_motor, dado_escudo, limite)valida o motor contra olimite(temperatura) e o escudo contra o limiar de energia: um escudo fraco (valor baixo, ex.:"5") retornaEnergiaInsuficiente— o escudo precisa de energia mínima para se manter ativo.
9. Como Executar
cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check
10. Dicas
?só funciona em funções que retornamResultouOptionFrom<ParseIntError> for ErroSubsistemapermite?converter erros automaticamente- Use
map_errquando a conversãoFromnão está disponível - Early returns com
if+return Err(...)são preferíveis a aninhamento profundo