Aracılığıyla paylaş


Çerçeve Tabanlı Özel Durum İşleme

çerçeve tabanlı özel durum işleyicisi, belirli bir kod dizisinde özel durum oluşma olasılığıyla başa çıkmanızı sağlar. Çerçeve tabanlı özel durum işleyicisi aşağıdaki öğelerden oluşur.

  • Korumalı bir kod gövdesi
  • Filtre ifadesi
  • Özel durum işleyici bloğu

Çerçeve tabanlı özel durum işleyicileri dile özgü söz diziminde bildirilir. Örneğin, Microsoft C/C++ derleyicisini iyileştirme bölümünde, __try ve __exceptkullanılarak uygulanır. Daha fazla bilgi için bkz. İşleyici Söz Dizimi.

korunan kodun gövdesi, filtre ifadesinin ve özel durum işleyici bloğunun özel durum işleme koruması sağladığı bir veya daha fazla deyim kümesidir. Korunan gövde bir kod bloğu, iç içe bloklar kümesi veya tüm prosedür veya işlev olabilir. Microsoft C/C++ Optimizasyonlu Derleyicisi kullanılarak, korunan gövde __try anahtar sözcüğünden sonra küme ayraçları ({}) içine alınır.

Çerçeve tabanlı özel durum işleyicisinin filtre ifadesi, korunan gövdede bir özel durum oluştuğunda sistem tarafından değerlendirilen bir ifadedir. Bu değerlendirme, sistem tarafından aşağıdaki eylemlerden birine neden olur.

  • Sistem bir özel durum işleyicisi aramasını durdurur, makine durumunu geri yükler ve özel durumun oluştuğu noktada iş parçacığı yürütmeye devam eder.
  • Sistem bir özel durum işleyicisi aramaya devam eder.
  • Sistem denetimi özel durum işleyicisine aktarır ve iş parçacığı yürütmesi, özel durum işleyicisinin bulunduğu yığın çerçevesinde sıralı olarak devam eder. İşleyici, özel durumun gerçekleştiği yığın çerçevesinde değilse, sistem yığında geri sarma işlemi yapıp mevcut çerçeveyi ve diğer çerçeveleri geçerek, özel durum işleyicisinin yığın çerçevesine dönene kadar devam eder. Bir özel durum işleyicisi yürütülmeden önce sonlandırma işleyicileri, denetimin özel durum işleyicisine aktarılması sonucunda sonlandırılan tüm korunan kod gövdeleri için yürütülür. Sonlandırma işleyicileri hakkında daha fazla bilgi için bkz. Sonlandırma İşleme.

Filtre ifadesi basit bir ifade olabilir veya özel durumu işlemeye çalışan bir filtre işlevi çağırabilir. Filtrelenen özel durum hakkında bilgi almak için GetExceptionCode çağırabilir ve filtre ifadesinin içinden GetExceptionInformationişlevlerini. GetExceptionCode özel durum türünü tanımlayan bir kod döndürür ve GetExceptionInformation CONTEXT ve EXCEPTION_RECORD yapılarına yönelik işaretçiler içeren bir EXCEPTION_POINTERS yapısına işaretçi döndürür.

Bu işlevler filtre işlevinin içinden çağrılamaz, ancak dönüş değerleri bir filtre işlevine parametre olarak geçirilebilir. GetExceptionCode özel durum işleyici bloğu içinde kullanılabilir, ancak GetExceptionInformation, işaret ettiği bilgiler genellikle yığında olduğundan ve denetim bir özel durum işleyicisine aktarıldığında yok edildiğinden kullanılamaz. Ancak, bir uygulama özel durum işleyicisi için kullanılabilir hale getirmek için bilgileri güvenli depolamaya kopyalayabilir.

Filtre işlevinin avantajı, bir özel durumu işleyip sistemin özel durumun oluştuğu noktadan yürütmeye devam etmesine neden olan bir değer döndürmesidir. Buna karşılık özel durum işleyici bloğunda yürütme, özel durum noktasından değil, özel durum işleyicisinden sıralı olarak devam eder.

Bir özel durumu işlemek bir hataya dikkat çekmek ve daha sonra incelenecek bir bayrak ayarlamak, uyarı veya hata iletisi yazdırmak ya da başka bir sınırlı eylemde bulunarak basit olabilir. Yürütmeye devam edilebiliyorsa, bağlam kaydını değiştirerek makine durumunu değiştirmek de gerekebilir. Sayfa hatası özel durumunu işleyen bir filtre işlevi örneği için bkz. Sanal Bellek İşlevlerini kullanma.

UnhandledExceptionFilterişlevibir filtre ifadesinde filtre işlevi olarak kullanılabilir. İşlem hata ayıklaması yapılmadığı sürece EXCEPTION_EXECUTE_HANDLER döndürür ve bu durumda EXCEPTION_CONTINUE_SEARCH döndürür.