Hata Denetimi
Önceki II. Oylum - Hata Bildirme Sonraki
Hata Denetimi
Kütüphane işlevlerinin çoğu başarısız olduğu durumlarda özel bir değer döndürür. Bu özel değer genellikle ya -1 veya bir boş gösterici ya da bu amaç için tanımlanmış EOF gibi bir sabitttir. Bu geridönüş değeri size sadece bir hatanın oluştuğu bilgisini verir. Hatanın çeşidini bulmak için errno değişkeninde saklanan hata koduna bakmanız gerekir. Bu değişken errno.h başlık dosyasında bildirilmiştir.
volatile int errno
değişken
errno değişkeni sistem hata numarasını içerir. Siz errno değişkeninin değerini değiştirebilirsiniz.
errno değişkeni volatile olarak bildirildiğinden bir sinyal tuzağı tarafından herhangi bir anda değiştirilebilir. Doğru yazılmış bir sinyal tuzağı errno değişkeninin değerini saklayabildiğinden ya da eski değerine döndürebildiğinden, sinyal tuzaklarını yazmak dışında bu konuda kaygılanmanız gerekmez.
errno değişkeni yazılım ilklendirildiğinde sıfır değerine sahiptir. Birçok kütüphane işlevi bir hata oluştuğunda sıfırdan farklı bir değerle dönmeyi garanti eder. Bu hata durumları her işlev için listelenmiştir. Bu işlevler başarılı olduklarında errno değişkeninin değerini değiştirmezler. Bu nedenle, başarılı bir işlev çağrısı sonucunda errno değişkeninin değeri sıfır olmayabileceğinden, bir işlev çağrısının başarılı olup olmadığını errno değişkeninin değerine bakarak saptamaya çalışmamalısınız. Bunu yapmanın doğru yolu her işlev için belgelendirilmiştir. Eğer çağrı başarısızsa errno değişkeninin değerine bakabilirsiniz.
Birçok kütüphane işlevi, çağırdığı bir başka kütüphane işlevinin başarısızlığı durumunda errno değişkeninin değerini sıfırdan farklı bir değere ayarlayabilir. Kütüphane işlevlerinin, işlev bir hata geri döndürdüğünde errno değişkeninin değerini değiştirdiği kabulune göre hareket etmelisiniz.
Uyumluluk bilgisi
ISO C, bir makro olarak gerçekleştirilebileceğinden errno'nun bir değişken değil bir "değiştirilebilir sol taraf değeri" olduğunu belirtir. Örneğin, GNU sisteminde olduğu gibi *_errno () benzeri bir işlev çağrısı ile ilişkilendirilmiş olabilir. Bu nedenle GNU kütüphanesi, GNU dışı sistemlerde de doğru sonuçlar verir.
sqrt ve atan gibi bazı kütüphane işlevleri bir hata durumunda errno değerini de ayarladıklarından kusursuz doğrulukta bir değer döndürürler. Bu gibi işlevler için, işlev çağrısından önce errno değişkenine sıfır değerini atamalı ve sonrasında errno değişkeninin değerine bakmalısınız.
Tüm hata kodları için errno.h başlık dosyasında birer makro olarak tanımlanmış birer sembolik isim vardır. Bu isimler daima bir E harfi ile başlar ve bir rakam ya da büyük harf ile devam eder. Bu isimleri birer anahtar sözcük gibi ele almalısınız.
Hata kodu değerlerinin hepsi pozitif tamsayılardır ve tamamı farklı değerlere sahiptir; bu ikisi dışında: EWOULDBLOCK ve EAGAIN aynı değere sahiptir. Değerleri farklı olduğundan hata kodlarını switch deyiminde etiket olarak kullanabilirsiniz; ama EWOULDBLOCK ve EAGAIN isimlerinden sadece birini kullanmalısınız. Yazılımınız bu sembolik sabitlerin özel değerleri dışında bir kabulde bulunmamalıdır.
errno değeri herzaman bu makroların değerlerine karşılık değildir; bazı kütüphane işlevleri kendi özel durumlarına özgü hata kodları döndürebilir. Belli bir kütüphane işlevi için anlamlı olabilen bu değerleri içeren işlevler kılavuzda belirtilmiştir.
GNU dışı sistemlerin hemen hepsinde bir sistem çağrısı, argüman olarak bir geçersiz gösterici ile çağrılmışsa EFAULT ile dönebilir. Bu sadece yazılımınızdaki bir yazılım hatasının sonucu olarak görülebileceğinden ve "GNU sistemlerinde asla bu hatayı göremeyeceğinizden" işlevlerin açıklamalarında EFAULT hatasına hiç yer verilmemiş ama bu değer kütüphaneye konmuştur.
Bazı Unix sistemlerinde birçok sistem çağrısı, bir argüman olarak verilmiş yığıt ya da çekirdek içindeki bir göstericinin, yığıtı genişletmeye çalışmak gibi anlaşılmaz bir sebeple başarısız olması durumunda EFAULT ile dönebilir. Bu gibi durumların oluşmaması için sistemdeki yığıt belleği yerine durağan ya da özdevimli bellek ayırmaya çalışmalısınız.
Önceki Üst Ana Başlık Sonraki
II. Oylum - Hata Bildirme Başlangıç Hata Kodları
Bir Linux Kitaplığı Sayfası