📊 Capítulo 14: Erros, std::optional & expected
Especialização em Sistemas com C++
🗺️ Paradigmas de Erro: Exceções vs Tipos Algébricos de Retorno
flowchart TD
subgraph EXCEPTIONS ["Exceções Tradicionais (try / catch)"]
E1["throw std::runtime_error('falha')\n(Excelente para erros excepcionais e raros / Zero custo no 'caminho feliz', porém unwinding custoso quando falha!)"]
end
subgraph VALUES ["Tipos de Retorno Funcionais (C++17 / C++23)"]
V1["std::optional<T>\n(Retorna valor ou std::nullopt / Sem overhead de heap!) ⚡"]
V2["std::expected<T, Erro> (C++23)\n(Retorna o valor T com sucesso OU o objeto de Erro tipado sem lançar exceção!) 🛡️"]
end
style EXCEPTIONS fill:#ede7f6,stroke:#512da8,stroke-width:2px
style VALUES fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style V1 fill:#e1f5fe,stroke:#03a9f4,stroke-width:1.5px
style V2 fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px
🎯 Slide 1: std::optional<T> (O Fim de Retornar Ponteiros Nulos)
#include <optional>
std::optional<Usuario> buscar_usuario(int id) {
if (id <= 0) return std::nullopt;
return Usuario{id, "Alice"};
}
// Consumo elegante:
auto user = buscar_usuario(42).value_or(Usuario{0, "Convidado"});
🎯 Slide 2: std::variant e std::visit (União Type-Safe)
- Substitui a arcaica e insegura
unionde C:
using Resposta = std::variant<int, std::string, double>;
Resposta r = "Operação Concluída";
std::visit([](const auto& val) {
std::println("Valor recebido: {}", val);
}, r);
🎯 Slide 3: std::expected<T, E> (C++23)
- Permite encadear operações com
.and_then()e.or_else(), trazendo a expressividade doResult<T, E>de Rust diretamente para o C++ padrão!
🔗 Navegação do Capítulo 14
| 📖 Ler Conteúdo Completo | 🧠 Fazer Quiz | 💻 Ver Exemplos | 🧩 Exercícios |
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim