C++
std::expected
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
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
Cevabı göster
Beklenen hata durumlarını değer olarak döndürmek için — std::expected, beklenen hataları istisna yerine değer olarak döndürür.
-
Üyeyi rolüne eşle
- has_value
- Değer var mı?
- value()
- Değeri al
- error()
- Hatayı al
- std::unexpected
- Hata üretir
-
.value() çağrısı
if (r.has_value()) std::cout << r.____();
Cevabı göster
if (r.has_value()) std::cout << r.value();
Sıradaki ders: noexcept