Zig Error Set ve Catch Yapılarıyla Hata Yakalama
Zig Programlama Dilinde Tip Güvenli Hata Yönetimi: error set
ve catch
Kullanımı
Giriş
Zig dili, belirsiz ve kontrolsüz istisna yönetimini terk ederek daha sağlam ve öngörülebilir bir hata modeli sunar. Bu yazıda, Zig'in error set
ve catch
mekanizmaları bir örnek proje üzerinden açıklanacaktır. Ele alınan örnek, sayısal değerleri kontrol eden ve hata durumlarına karşı alternatif çıktılar üreten basit ama öğretici bir yapıya sahiptir.
Sayı Değerlerine Göre Hata Yakalayan Bir Uygulama
Aşağıda, belirli bir kontrol listesinde yer alan sayısal değerleri mantıksal kurallar çerçevesinde sınayan ve olası hata durumlarına göre uygun düzeltmeleri gerçekleştiren bir Zig uygulaması yer almaktadır. Uygulama; negatif, çok küçük veya çok büyük sayı değerlerini özel olarak tanımlanmış hata türleriyle sınıflandırmakta ve bu hataları catch mekanizması ile yakalayarak her bir duruma karşılık gelen düzeltme değerlerini üretmektedir. Amaç, hatalı verileri güvenli ve kontrol edilebilir biçimde işleyerek standart bir çıktı oluşturmaktır.
const std = @import("std");
// Hata Türlerini error set ile tanımlamak
const MyNumberError = error{
TooBig,
TooSmall,
Negative,
};
// Yapılacak operasyonlar
pub fn CatchOps() void {
// kontrol listesi
const kontrolListe = [_]i32{ -1, 45, 8, 12, 20 };
// kontrol listesi icin bir for döngüsü yazıldı
for (kontrolListe) |n| {
// düzeltilmiş degerler icin bir catch ifadesi oluşturuldu
const fixed = fixTheValues(n) catch 0;
std.debug.print("Input: {}, Fixed Value: {}\n", .{ n, fixed });
}
}
// Eğer sayı belirtilenden büyük ise onun yerine 20 yazdırır
fn fixTheValues(n: i32) MyNumberError!i32 {
return checkNumber(n) catch |err| {
if (err == MyNumberError.TooSmall) return 21;
if (err == MyNumberError.TooBig) return 40;
if (err == MyNumberError.Negative) return 1;
return err;
};
}
// hata türlerini inceleyen fonksiyon yapısı
fn checkNumber(n: i32) MyNumberError!i32 {
// eğer hata döndürülecekse bu bloktaki hatalar döner
if (n < 0) return MyNumberError.Negative;
if (n < 20) return MyNumberError.TooSmall;
if (n > 20) return MyNumberError.TooBig;
// sayiyi dondurur
return n;
}
Hata Türlerinin Tanımlanması
const MyNumberError = error{
TooBig,
TooSmall,
Negative,
};
Bu error set
, fonksiyonların döndürebileceği özel hata türlerini tanımlar. Zig dilinde hata setleri sayesinde hangi hata türlerinin oluşabileceği tip sistemiyle garanti altına alınır.
Giriş Fonksiyonu: CatchOps
pub fn CatchOps() void {
const kontrolListe = [_]i32{ -1, 45, 8, 12, 20 };
for (kontrolListe) |n| {
const fixed = fixTheValues(n) catch 0;
std.debug.print("Input: {}, Fixed Value: {}\n", .{ n, fixed });
}
}
Açıklamalar:
kontrolListe
: Sabit biri32
dizisi.for (kontrolListe) |n|
: Dizi elemanlarında döner.fixTheValues(n) catch 0
: Hata oluşursa değeri0
ile değiştirir.std.debug.print
: Giriş ve düzeltme sonucunu yazdırır.
Bu yapı, hata yönetiminin çağırıcı düzeyde nasıl ele alınacağını açıkça göstermektedir.
Hata Yakalayıcı Fonksiyon: fixTheValues
fn fixTheValues(n: i32) MyNumberError!i32 {
return checkNumber(n) catch |err| {
if (err == MyNumberError.TooSmall) return 21;
if (err == MyNumberError.TooBig) return 40;
if (err == MyNumberError.Negative) return 1;
return err;
};
}
checkNumber(n)
çağrılır ve hata fırlatırsacatch
bloğuna geçilir.- Hata türüne göre düzeltme değeri atanır.
- Geriye yeni bir
i32
değeri döndürülür.
Bu yapı, Zig dilinin hata yakalama mekanizmasını detaylı şekilde örneklemektedir.
Sayı Denetleyici Fonksiyon: checkNumber
fn checkNumber(n: i32) MyNumberError!i32 {
if (n < 0) return MyNumberError.Negative;
if (n < 20) return MyNumberError.TooSmall;
if (n > 20) return MyNumberError.TooBig;
return n;
}
Bu fonksiyon sayının geçerliliğini kontrol eder:
n < 0
→Negative
n < 20
→TooSmall
n > 20
→TooBig
- Aksi takdirde (
n == 20
) → değer geçerli kabul edilir ve döndürülür.
Bu mantık sıralaması doğru yapılmıştır; önce negatiflik, sonra aralık kontrolü gerçekleştirilir.
Örnek Çıktı
Program çalıştırıldığında aşağıdaki çıktı elde edilir:
Input: -1, Fixed Value: 1
Input: 45, Fixed Value: 40
Input: 8, Fixed Value: 21
Input: 12, Fixed Value: 21
Input: 20, Fixed Value: 20
Her sayının hata durumu kontrol edilir, hatalıysa uygun sabit değerle düzeltilir.
Sonuç
Bu örnek, Zig dilinde tip güvenli ve açık hata yönetiminin nasıl uygulandığını göstermektedir. Hatalar yalnızca tanımlı türlerle ifade edilir, çağırıcı tarafından mutlaka yakalanır ya da açıkça ele alınır. Bu yapı, hem okunabilirliği hem de güvenilirliği ciddi ölçüde artırır.
Zig, bu açıdan C’nin belirsiz errno
yaklaşımlarına kıyasla çok daha sağlam bir mimari sunmaktadır.