D Programlama Dili – Programlama dersleri ve D referansı
Ali Çehreli

blok: [block], küme parantezleriyle gruplanmış ifadelerin tümü
deyim: [statement], ifadelerin işletilmelerini ve sıralarını etkileyen program yapısı
hata atma: [throw exception], işlemin devam edilemeyeceği için sonlandırılması
ifade: [expression], programın değer oluşturan veya yan etki üreten bir bölümü
kapsam: [scope], küme parantezleriyle belirlenen bir alan
... bütün sözlük



İngilizce Kaynaklar


Diğer




scope

Kesinlikle işletilmeleri gereken ifadelerin finally bloklarına, hatalı durumlarda işletilmeleri gereken ifadelerin de catch bloklarına yazıldıklarını bir önceki bölümde gördük. Bu blokların kullanımlarıyla ilgili bir kaç gözlemde bulunabiliriz:

catch ve finally bloklarına benzer şekilde işleyen ve bazı durumlarda daha uygun olan olanak scope deyimidir. Üç farklı scope kullanımı, yine ifadelerin kapsamlardan çıkılırken kesinlikle işletilmeleri ile ilgilidir:

Bu deyimler yine atılan hatalarla ilgili olsalar da try-catch bloklarının parçası değillerdir.

Örneğin, hata atıldığında çıkış'ın değerini düzeltmeye çalışan yukarıdaki işlevi bir scope(failure) deyimiyle daha kısa olarak şöyle yazabiliriz:

void birİşlev(ref int çıkış) {
    int birDeğer = 42;

    çıkış += birDeğer;
    scope(failure) çıkış -= birDeğer;

    hataAtabilecekBirİşlev();
}

Yukarıdaki scope deyimi, kendisinden sonra yazılan ifadenin işlevden hata ile çıkıldığı durumda işletileceğini bildirir. Bunun bir yararı, yapılan bir değişikliğin hatalı durumda geri çevrilecek olduğunun tam da değişikliğin yapıldığı yerde görülebilmesidir.

scope deyimleri bloklar halinde de bildirilebilirler:

    scope(exit) {
        // ... çıkarken işletilecek olan ifadeler ...
    }

Bu kavramları deneyen bir işlevi şöyle yazabiliriz:

void deneme() {
    scope(exit) writeln("çıkarken 1");

    scope(success) {
        writeln("başarılıysa 1");
        writeln("başarılıysa 2");
    }

    scope(failure) writeln("hata atılırsa 1");
    scope(exit) writeln("çıkarken 2");
    scope(failure) writeln("hata atılırsa 2");

    yüzdeElliHataAtanİşlev();
}

İşlevin çıktısı, hata atılmayan durumda yalnızca scope(exit) ve scope(success) ifadelerini içerir:

çıkarken 2
başarılıysa 1
başarılıysa 2
çıkarken 1

Hata atılan durumda ise scope(exit) ve scope(failure) ifadelerini içerir:

hata atılırsa 2
çıkarken 2
hata atılırsa 1
çıkarken 1
object.Exception: hata mesajı

Çıktılardan anlaşıldığı gibi, scope deyimlerinin ifadeleri ters sırada işletilmektedir. Bunun nedeni, daha sonra gelen kodların daha önceki değişkenlerin durumlarına bağlı olabilecekleridir. scope deyimlerindeki ifadelerinin ters sırada işletilmeleri programın durumunda yapılan değişikliklerin geri adımlar atılarak ters sırada işletilmelerini sağlar.