gokayburuc.dev

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:

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;
    };
}

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:

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.


Ek Kaynaklar

#zig