Noções Básicas de Tratamento de Erros
8 exemplos - 5 básicos, 3 intermediários - cobrindo Option, Result e quando entrar em pânico (panic).
Pré-requisitos
Exemplos Básicos
1. Option para Valores Ausentes
fn find(ids: &[u32], target: u32) -> Option<usize> {
ids.iter().position(|&id| id == target)
}Nonesignifica não encontrado sem detalhe de erroSome(i)carrega o índice- Sem ponteiros nulos
2. Result para Falhas
use std::fs;
fn read(path: &str) -> Result<String, std::io::Error> {
fs::read_to_string(path)
}Errinclui a razão do erroOkem caso de sucesso- Erros recuperáveis usam
Result
3. match em Result
fn main() {
match read("Cargo.toml") {
Ok(body) => println!("{body}"),
Err(e) => eprintln!("{e}"),
}
}4. unwrap e expect (protótipos)
let n: u32 = "42".parse().expect("porta válida");- Entra em pânico (
panic) emErr- apenas para binários/protótipos - Bibliotecas devem retornar
Result
5. Prévia da Propagação ?
fn load() -> Result<String, std::io::Error> {
let s = std::fs::read_to_string("config.toml")?;
Ok(s)
}Relacionado: O Operador ?
Exemplos Intermediários
6. Combinando Option e Result
fn first_user(names: &[&str]) -> Result<&str, &'static str> {
names.first().ok_or("lista vazia")
}7. map e and_then
let port: Option<u16> = Some("8080")
.and_then(|s| s.parse().ok());8. Prévia de Enum de Erro Personalizado
enum AppError { Io(std::io::Error), Parse(std::num::ParseIntError) }Relacionado: Boas Práticas de Tratamento de Erros
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edition 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.