Visual Studio'da hata ayıklayıcı ile özel durumları yönetme

Özel durum, bir program yürütülürken oluşan bir hata durumunun göstergesidir. Hata ayıklayıcıya hangi özel durumların veya özel durum kümelerinin kesileceğini ve hata ayıklayıcının hangi noktada kesmesini istediğinizi (hata ayıklayıcıda duraklatma) belirtebilirsiniz. Hata ayıklayıcı durdurulduğunda, istisnanın nerede atıldığını gösterir. Ayrıca özel durumlar ekleyebilir veya silebilirsiniz. Visual Studio'da açık olan bir çözümle, > penceresini açmak için Windows > Özel Durum Ayarlarında Hata Ayıklama'yı kullanın.

En önemli özel durumlara yanıt veren işleyiciler sağlayın. Özel durumlar için işleyicilerin nasıl ekleneceğini bilmeniz gerekiyorsa bkz. Daha iyi C# kodu yazarak hataları düzeltme. Ayrıca, hata ayıklayıcısını bazı özel durumlar için yürütmeyi her zaman kesecek şekilde yapılandırmayı öğrenin.

Bir özel durum oluştuğunda, hata ayıklayıcı Çıkış penceresine bir özel durum iletisi yazar. Aşağıdaki durumlarda yürütme kesilebilir:

  • İşlenmeyen bir özel durum fırlatılır.
  • Hata ayıklayıcısı, herhangi bir işleyici çağrılmadan önce yürütmeyi kesecek şekilde yapılandırılır.
  • Yalnızca Benim Kodum'u ayarladınız ve hata ayıklayıcıyı, kullanıcı kodunda işlenmemiş herhangi bir istisna durumunda duracak şekilde yapılandırdınız.

Uyarı

ASP.NET, tarayıcıda hata sayfalarını gösteren üst düzey bir özel durum işleyicisi vardır. Yalnızca Kodum açık olmadığı sürece yürütmeyi bozmaz. Örnek için aşağıdaki Hata ayıklayıcıya kullanıcı tarafından işlenmeyen özel durumlara devam etmelerini söyleme bölümüne bakın.

Uyarı

Bir Visual Basic uygulamasında, hata ayıklayıcısı, On Error tarzı hata işleyicilerinde kullansanız bile tüm hataları özel durum olarak yönetir.

Özel durum oluştuğunda hata ayıklayıcıya kesmesini söyleyin

Hata ayıklayıcı, bir özel durumun oluştuğu noktada yürütmeyi kesebilir, bu nedenle bir işleyici çağrılmadan önce özel durumu inceleyebilirsiniz.

Özel Durum Ayarları penceresinde (Windows > Özel Durum Ayarlarında Hata Ayıkla>), Ortak Dil Çalışma Zamanı Özel Durumları gibi bir özel durum kategorisinin düğümünü genişletin. Ardından bu kategorideki system.AccessViolationException gibi belirli bir özel durumun onay kutusunu seçin. Özel durumlar kategorisinin tamamını da seçebilirsiniz.

Özel Durum Ayarları iletişim kutusunun ekran görüntüsü.

Özel Durum Ayarları onay kutusunun ekran görüntüsü.

Tip

Özel Durum Ayarları araç çubuğundaki Arama penceresini kullanarak belirli özel durumları bulabilir veya belirli ad alanlarını (System.IO gibi) filtrelemek için aramayı kullanabilirsiniz.

Özel Durum Ayarları penceresinde bir özel durum seçerseniz, işlenip işlenmediği fark etmez, özel durumun oluştuğu her yerde hata ayıklayıcı yürütmesi bozulacaktır. Şimdi özel durum, ilk şans özel durumu olarak adlandırılır. Örneğin, birkaç senaryo aşağıda verilmiştir:

  • Aşağıdaki C# konsol uygulamasında Main yöntemi bir bloğu içerisinde try/catch fırlatır.

    static void Main(string[] args)
    {
        try
        {
            throw new AccessViolationException();
            Console.WriteLine("here");
        }
        catch (Exception e)
        {
            Console.WriteLine("caught exception");
        }
        Console.WriteLine("goodbye");
    }
    

    Özel Durum Ayarları'ndaAccessViolationException seçeneğini işaretlediyseniz, bu kodu hata ayıklayıcıda çalıştırdığınızda yürütme satırda bozulacaktırthrow. Ardından işlemi yürütmeye devam edebilirsiniz. Konsolun her iki satırı da görüntülemesi gerekir:

    caught exception
    goodbye
    

    ancak here satırı görüntülenmiyor.

  • C# konsol uygulaması iki yöntemi olan bir sınıf kitaplığına başvurur. Bir yöntem bir özel durum oluşturur ve bunu işlerken ikinci bir yöntem aynı özel durumu oluşturur ancak işlemez.

    public class Class1
    {
        public void ThrowHandledException()
        {
            try
            {
                throw new AccessViolationException();
            }
            catch (AccessViolationException ave)
            {
                Console.WriteLine("caught exception" + ave.Message);
            }
        }
    
        public void ThrowUnhandledException()
        {
            throw new AccessViolationException();
        }
    }
    

    Konsol uygulamasının Main() yöntemi aşağıdadır:

    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.ThrowHandledException();
        class1.ThrowUnhandledException();
    }
    

    Özel Durum Ayarları'ndaAccessViolationException seçeneğini işaretlediyseniz, bu kodu hata ayıklayıcıda çalıştırdığınızda hem throw hem de ThrowUnhandledException() içindeki satırda yürütme kesilecektir.

Özel durum ayarlarını varsayılan ayarlara geri yüklemek için Listeyi varsayılan ayarlara geri yükle düğmesini seçin:

Özel Durum Ayarları'ndaki Varsayılanları geri yükle düğmesinin ekran görüntüsü.

Özel Durum Ayarları'ndaki Varsayılanları Geri Yükle'nin ekran görüntüsü.

Hata ayıklayıcıya kullanıcı tarafından işlenmeyen özel durumlarda devam etmelerini söyleyin

.NET veya JavaScript kodunda Just My Code ile hata ayıklarsanız, hata ayıklayıcıya kullanıcı kodunda işlenmemiş ancak başka bir yerde işlenen özel durumlarda hata ayıklamayı önlemesini söyleyebilirsiniz.

  1. Özel Durum Ayarları penceresinde, bir sütun etiketine sağ tıklayarak kısayol menüsünü açın ve sonra Sütunları > Göster Ek Eylemleri'ni seçin. ( Yalnızca Kodum seçeneğini kapattıysanız bu komutu görmezsiniz.) Ek Eylemler adlı üçüncü bir sütun görüntülenir.

    Ek Eylemler sütununun ekran görüntüsü.

    Bu sütunda kullanıcı kodunda işlenmediğinde Devam Et gösterilen bir özel durum için, bu özel durum kullanıcı kodunda işlenmezse ancak harici olarak işlenirse hata ayıklayıcı devam eder.

  2. Belirli bir özel durum için bu ayarı değiştirmek üzere özel durumu seçin, kısayol menüsünü göstermek için sağ tıklayın ve Kullanıcı Kodunda İşlenmeyen Durumlarda Devam Et'i seçin. Ayrıca, Ortak Dil Çalışma Zamanı özel durumlarının tamamı gibi bir özel durum kategorisinin tamamının ayarını da değiştirebilirsiniz.

    Kullanıcı kodunda işlenmediğinde devam et ayarının ekran görüntüsü.

Örneğin, ASP.NET web uygulamaları özel durumları http 500 durum koduna (ASP.NET Web API'sinde özel durum işleme) dönüştürerek işler ve bu da özel durumun kaynağını belirlemenize yardımcı olmayabilir. Aşağıdaki örnekte, kullanıcı kodu bir String.Format() oluşturan FormatException çağrısı yapar. Yürütme aşağıdaki gibi kesintiye uğrar:

System.FormatException'ı gösteren ekran görüntüsü.

Kullanıcı tarafından işlenmeyen istisna üzerindeki durmalar

Özel durum ekleme ve silme

Özel durumlar ekleyebilir ve silebilirsiniz. Bir kategoriden bir özel durum türünü silmek için özel durumu seçin ve Özel Durum Ayarları araç çubuğundaki Liste düğmesinden (eksi işareti) seçili özel durumu sil'i seçin. Veya özel duruma sağ tıklayıp kısayol menüsünden Sil'i seçebilirsiniz. Bir özel durumun silinmesi, özel durumun işaretinin kaldırılmış olmasıyla aynı etkiye sahiptir. Bu, hata ayıklayıcının oluşturulduğu sırada bozulmayacağından kaynaklanır.

Özel durum eklemek için:

  1. Özel Durum Ayarları penceresinde özel durum kategorilerinden birini seçin (örneğin, Ortak Dil Çalışma Zamanı).

  2. Seçili kategoriye özel durum ekle düğmesini (artı işareti) seçin.

    Seçili kategoriye özel durum ekle düğmesinin ekran görüntüsü.

    Seçili kategoriye özel durum ekle düğmesinin ekran görüntüsü.

  3. Özel durumun adını yazın (örneğin, System.UriTemplateMatchException).

    Özel durum adını gösteren ekran görüntüsü.

    Tür özel durum adının ekran görüntüsü.

    Özel durum listeye eklenir (alfabetik sırada) ve otomatik olarak denetlenilir.

GPU Bellek Erişimi Özel Durumları, JavaScript Çalışma Zamanı Özel Durumları veya Win32 Özel Durumlar kategorilerine özel durum eklemek için hata kodunu ve açıklamayı ekleyin.

Tip

Yazım denetimi yapın! Özel Durum Ayarları penceresi, eklenen bir özel durumun varlığını denetlemez. Dolayısıyla Sytem.UriTemplateMatchException yazarsanız, bu özel durum için bir giriş alırsınız ( System.UriTemplateMatchException için değil).

Özel durum ayarları, belirli bir çözüme özgü olacak şekilde çözümün .suo dosyasında kalıcı olarak saklanır. Belirli özel durum ayarlarını çözümler arasında yeniden kullanamazsınız. Artık yalnızca eklenen özel durumlar kalıcı hale geliyor; silinen özel durumlar değildir. Bir özel durum ekleyebilir, çözümü kapatıp yeniden açabilirsiniz ve özel durum yine de orada olur. Ancak bir özel durumu siler ve çözümü kapatır/yeniden açarsanız, özel durum yeniden görünür.

Özel Durum Ayarları penceresi, C# dilinde genel özel durum türlerini destekler ancak Visual Basic'te desteklemez. gibi MyNamespace.GenericException<T>özel durumları kesmek için, özel durumu MyNamespace.GenericException'1 olarak eklemeniz gerekir. Yani, aşağıdaki kod gibi bir özel durum oluşturduysanız:

public class GenericException<T> : Exception
{
    public GenericException() : base("This is a generic exception.")
    {
    }
}

Önceki yordamı kullanarak Özel Durum Ayarları'na özel durum ekleyebilirsiniz:

Genel özel durumun nasıl ekleneceğini gösteren ekran görüntüsü.

Genel özel durum ekle'nin ekran görüntüsü.

Özel duruma koşul ekleme

Özel durumlarla ilgili koşulları ayarlamak için Özel Durum Ayarları penceresini kullanın. Şu anda desteklenen koşullar, özel durum için dahil etmek veya dışlamak için modül adlarını içerir. Modül adlarını koşul olarak ayarlayarak, özel durum için yalnızca belirli kod modüllerinde kesmeyi seçebilirsiniz. Ayrıca belirli modüllerde hata oluşmasını önlemeyi de seçebilirsiniz.

Uyarı

Visual Studio 2017'den başlayarak özel duruma koşul ekleme işlemi desteklenir.

Koşullu özel durumlar eklemek için:

  1. Özel Durum Ayarları penceresinde Koşulları düzenle düğmesini seçin veya özel duruma sağ tıklayıp Koşulları Düzenle'yi seçin.

    Özel durum koşullarının ekran görüntüsü.

    Özel durum koşullarının ekran görüntüsü.

  2. Özel duruma fazladan gerekli koşullar eklemek için her yeni koşul için Koşul Ekle'yi seçin. Ek koşul satırları görüntülenir.

    Özel durum için ek koşulları gösteren ekran görüntüsü.

    Özel durum için ek koşulların ekran görüntüsü.

  3. Her koşul satırı için modülün adını yazın ve karşılaştırma işleci listesini Eşittir veya Eşit Değil olarak değiştirin. Birden fazla modül belirtmek için adında joker karakterler (\*) belirtebilirsiniz.

  4. Bir koşulu silmeniz gerekiyorsa, koşul satırının sonundaki X işaretini seçin.