std::expected
- C++ kursu
- İleri seviye
- Ders 76/83
- 5 dk
std::expected ile hata yönetimini öğrenirsin.
std::expected nedir?
std::expected<T, E>, C++23 ile gelen bir türdür: ya bir T değeri ya da bir E hatası tutar. İstisna fırlatmak yerine hatayı dönüş değeri olarak verir.
Örnek: std::expected<int, std::string> divide(int a, int b). Başarıda return a / b;, hatada return std::unexpected(std::string("sıfıra bölme"));. Çağıran r.has_value() ile durumu kontrol eder, r.value() ile değeri, r.error() ile hatayı alır. Bu, istisna maliyetini olmadan hata yönetimi sağlar; özellikle gerçek hata (exception) ile beklenen durum (expected failure) ayrımı için kullanışlıdır.
value() ve error()
Bir std::expected nesnesinden değeri .value() ile, hatayı .error() ile alırsın. .has_value() önce kontrol edilmelidir.
Örnek: auto r = divide(10, 2); if (r.has_value()) std::cout << r.value(); else std::cout << r.error();. Eğer değer yokken .value() çağırırsan istisna fırlatılır. Bu yüzden önce has_value() ile denetlemek gerekir. std::unexpected ile hata üretilir: return std::unexpected(std::string("hata"));. Bu, açık ve tip-güvenli bir hata yönetimidir.
Uygulama divide fonksiyonunu std::expected ile yaz
std::expected<int, std::string> divide(int a, int b) fonksiyonunu yaz: b == 0 ise return std::unexpected(std::string("sıfıra bölme"));, değilse return a / b;. main içinde divide(10, 2) çağır; has_value() true ise value()'u, değilse error()'u std::cout ile yaz.
Başlangıç kodu
#include <iostream>
#include <expected>
#include <string>
// divide fonksiyonunu std::expected ile yaz
int main() {
// divide çağır ve sonuçu yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <expected>
#include <string>
std::expected<int, std::string> divide(int a, int b) {
if (b == 0) return std::unexpected(std::string("sıfıra bölme"));
return a / b;
}
int main() {
auto r = divide(10, 2);
if (r.has_value()) std::cout << r.value();
else std::cout << r.error();
return 0;
}Beklenen çıktı
5
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 std::expected ne zaman kullanılır?
- Her zaman istisna yerine
- Çoklu iş parçacığı için
- Yalnızca bellek hataları için
- Beklenen hata durumlarını değer olarak döndürmek için Doğru cevap
Açıklama: std::expected, beklenen hataları istisna yerine değer olarak döndürür.
2 Üyeyi rolüne eşle
| Kavram | Anlamı |
|---|---|
has_value |
Değer var mı? |
value() |
Değeri al |
error() |
Hatayı al |
std::unexpected |
Hata üretir |
3 .value() çağrısı
if (r.has_value()) std::cout << r.____();
if (r.has_value()) std::cout << r.value();
Açıklama: r.value() başarılı sonuçu döndürür.