🧩 Exercícios: Tratamento de Exceções, noexcept, std::optional e std::variant
Spec Sistemas Com Cpp • Trilha Progressiva em 4 Níveis
🧭 Navegação Pedagógica
-
📖 Teoria do Capítulo 💻 Exemplos 📊 Slides 🧠 Quiz
🎯 Nível 1: Fundamentos
Problema 14.1 — Tratamento de Exceções com try-catch e Hierarquia std::exception
Contexto: Tratamento de Exceções com try-catch e Hierarquia std::exception no contexto de Tratamento de Exceções, noexcept, std::optional e std::variant.
Requisitos de Execução:
- Criar exceção customizada
class DominioException : public std::runtime_errore tratar adequadamente.
Resultado Esperado
Exceção customizada capturada e tratada exibindo mensagem explicativa.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_1_SeuNome - Envie na tarefa:
Atividade Cap 14 - Tratamento de Exceções, noexcept, std::optional e std::variant
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
#include <stdexcept>
#include <string>
class SaldoInsuficienteException : public std::runtime_error {
public:
explicit SaldoInsuficienteException(const std::string& msg) : std::runtime_error(msg) {}
};
int main() {
try {
throw SaldoInsuficienteException("Saldo inferior ao valor do saque.");
} catch (const std::exception& e) {
std::cout << "ERRO CAPTURADO: " << e.what() << std::endl;
}
return 0;
}
🔍 Nível 2: Prática
Problema 14.2 — Valores Opcionais sem Ponteiros Nulos com std::optional
Contexto: Valores Opcionais sem Ponteiros Nulos com std::optional no contexto de Tratamento de Exceções, noexcept, std::optional e std::variant.
Requisitos de Execução:
- Retornar
std::optional<int>em busca em array e tratar retorno com.has_value()e.value_or().
Resultado Esperado
Ausência de valor representada sem alocações no heap ou ponteiros nulos.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_2_SeuNome - Envie na tarefa:
Atividade Cap 14 - Tratamento de Exceções, noexcept, std::optional e std::variant
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
#include <optional>
#include <vector>
std::optional<int> buscar_primeiro_par(const std::vector<int>& v) {
for (int n : v) {
if (n % 2 == 0) return n;
}
return std::nullopt;
}
int main() {
std::vector<int> nums{1, 3, 5, 8, 9};
auto res = buscar_primeiro_par(nums);
std::cout << "Par encontrado: " << res.value_or(-1) << std::endl;
return 0;
}
⚡ Nível 3: Integração
Problema 14.3 — Tipos Soma Seguros com std::variant e std::visit (Pattern Matching)
Contexto: Tipos Soma Seguros com std::variant e std::visit (Pattern Matching) no contexto de Tratamento de Exceções, noexcept, std::optional e std::variant.
Requisitos de Execução:
- Modelar resposta de API que pode ser
int(sucesso) oustd::string(erro) inspecionando comstd::visit.
Resultado Esperado
União com segurança de tipos (Type-safe Union) inspecionada via visitador.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_3_SeuNome - Envie na tarefa:
Atividade Cap 14 - Tratamento de Exceções, noexcept, std::optional e std::variant
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
#include <variant>
#include <string>
using Resposta = std::variant<int, std::string>;
int main() {
Resposta r = "Erro: Timeout de rede";
std::visit([](const auto& val) {
std::cout << "Payload recebido: " << val << std::endl;
}, r);
return 0;
}
🏆 Nível 4: Desafio Corporativo
Problema 14.4 — Retorno de Erros Monádicos com std::expected (C++23)
Contexto: Retorno de Erros Monádicos com std::expected (C++23) no contexto de Tratamento de Exceções, noexcept, std::optional e std::variant.
Requisitos de Execução:
- Retornar
std::expected<double, ErroCalculo>eliminando overhead de exceções em caminhos críticos.
Resultado Esperado
Fluxo funcional monádico com std::expected de altíssima performance homologado.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_4_SeuNome - Envie na tarefa:
Atividade Cap 14 - Tratamento de Exceções, noexcept, std::optional e std::variant
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
struct DivisaoPorZero {};
template <typename T>
struct ResultadoEsperado {
T valor;
bool ok;
};
ResultadoEsperado<double> dividir(double a, double b) {
if (b == 0.0) return {0.0, false};
return {a / b, true};
}
int main() {
auto res = dividir(10.0, 2.0);
if (res.ok) std::cout << "Resultado C++23: " << res.valor << std::endl;
return 0;
}
| ⬅️ Voltar ao Índice de Exercícios | 📚 Sumário de Tópicos |