Aracılığıyla paylaş


Özel Durumlar: MFC Özel Durum Makrolarından Dönüştürme

Bu gelişmiş bir konudur.

Bu makalede, C++ özel durum işleme anahtar sözcüklerini trycatchthrowkullanmak için Microsoft Foundation Sınıfı makrolarıyla yazılmış mevcut kodun (TRY, CATCH, THROW vb.) nasıl dönüştürüldüğü açıklanmaktadır. Konu başlıkları şunlardır:

Dönüştürmenin Avantajları

MFC sürüm 3.0'daki makro uygulamalarıyla önceki sürümlerdeki uygulamalar arasındaki farkların farkında olmanız gerekir, ancak var olan kodu dönüştürmeniz gerekmez. Bu farklar ve kod davranışındaki sonraki değişiklikler, Özel Durumlar: Sürüm 3.0'daki Özel Durum Makrolarındaki Değişiklikler bölümünde ele alınıyor.

Dönüştürmenin başlıca avantajları şunlardır:

  • C++ özel durum işleme anahtar sözcüklerini kullanan kod biraz daha küçük bir .EXE veya .DLL'ye derler.

  • C++ özel durum işleme anahtar sözcükleri daha çok yönlü: Kopyalanabilir herhangi bir veri türünün (int, float, charvb.) özel durumlarını işleyebilirken, makrolar yalnızca sınıf CException ve sınıflardan türetilen özel durumları işler.

Makrolar ve anahtar sözcükler arasındaki en önemli fark, makroları kullanan kodun özel durum kapsam dışına çıktığında yakalanan bir özel durumu "otomatik olarak" silmesidir. Anahtar sözcükleri kullanan kod bunu yapmaz, bu nedenle yakalanan özel durumu açıkça silmeniz gerekir. Daha fazla bilgi için Özel Durumlar: Özel Durumları Yakalama ve Silme makalesine bakın.

Diğer bir fark söz dizimidir. Makroların ve anahtar sözcüklerin söz dizimi üç açıdan farklılık gösterir:

  1. Makro bağımsız değişkenleri ve özel durum bildirimleri:

    CATCH makro çağrısı aşağıdaki söz dizimine sahiptir:

    CATCH(exception_class, exception_object_pointer_name)

    Sınıf adı ile nesne işaretçisi adı arasındaki virgüle dikkat edin.

    anahtar sözcüğü için catch özel durum bildirimi şu söz dizimini kullanır:

    catch(exception_typeexception_name)

    Bu özel durum bildirimi deyimi, catch bloğunun işlediği özel durum türünü gösterir.

  2. Catch bloklarının sınırlandırması:

    Makrolarla birlikte, CATCH makro (bağımsız değişkenleriyle) ilk yakalama bloğunu başlatır; AND_CATCH makro sonraki yakalama bloklarını başlatır ve END_CATCH makro, yakalama bloklarının sırasını sonlandırır.

    Anahtar sözcüklerle, catch anahtar sözcüğü (özel durum bildirimiyle) her catch bloğunu başlatır. END_CATCH makrosunun bir karşılığı yoktur; yakalama bloğu kapanış küme ayracı ile sona erer.

  3. Throw ifadesi:

    Makrolar geçerli özel durumu yeniden atmak için THROW_LAST kullanır. throw Bağımsız değişken içermeyen anahtar sözcüğü aynı etkiye sahiptir.

Dönüştürmeyi Yapma

C++ özel durum işleme anahtar sözcüklerini kullanmak üzere makro kullanarak kodu dönüştürmek için

  1. TRY, CATCH, AND_CATCH, END_CATCH, THROW ve THROW_LAST MFC makrolarının tüm oluşumlarını bulun.

  2. Aşağıdaki makroların tüm oluşumlarını değiştirin veya silin:

    TRY (ile trydeğiştirin)

    CATCH (bunu ile catchdeğiştirin)

    AND_CATCH (ile catchdeğiştirin)

    END_CATCH (Silin)

    THROW (şununla throwdeğiştirin)

    THROW_LAST (ile throwdeğiştirin)

  3. Makro bağımsız değişkenlerini geçerli özel durum bildirimleri oluşturacak şekilde değiştirin.

    Örneğin,

    CATCH(CException, e)
    

    kullanıcısı

    catch (CException* e)
    
  4. Catch bloklarındaki kodu, özel durum nesnelerini gerektiği gibi silecek şekilde değiştirin. Daha fazla bilgi için Özel Durumlar: Özel Durumları Yakalama ve Silme makalesine bakın.

Aşağıda, MFC özel durum makrolarını kullanan özel durum işleme kodu örneği verilmiştir. Aşağıdaki örnekteki kod makroları kullandığından özel durumun e otomatik olarak silindiğini unutmayın:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();

   if (m_bReturnFromThisFunction)
      return;

   // Not necessary to delete the exception e.
}
END_CATCH

Sonraki örnekteki kod C++ özel durum anahtar sözcüklerini kullandığından özel durumun açıkça silinmesi gerekir:

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch (CException* e)
{
   if (m_bPassExceptionsUp)
      throw;

   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }

   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }

   e->Delete();
}

Daha fazla bilgi için bkz . Özel Durumlar: MFC Makrolarını Kullanma ve C++ Özel Durumları.

Ayrıca bkz.

Özel Durum İşleme