SORU
2 Mart 2010, Salı


C orijinal İstisnalar dışında yeniden oluşturma hakkında sorular

Aşağıdaki ekler() catch özel durum rethrown Ekle etkisini görmek için neden() çağrıldığını?

try {
  mayThrowMyErr();
} catch (myErr &err) {
  err.append("Add to my message here");
  throw; // Does the rethrow exception reflect the call to append()?
}

Benzer şekilde, ben bu şekilde yeniden yazmak, bit Dilimleme gerçek özel myErr tarafından elde edilmesi durumunda ortaya çıkar?

try {
  mayThrowObjectDerivedFromMyErr();
} catch (myErr &err) {
  err.append("Add to my message's base class here");
  throw err; // Do I lose the derived class exception and only get myErr?
}

CEVAP
2 Mart 2010, Salı


Her iki durumda da bu yana yakalamak başvuru, etkili bir şekilde değiştiren devletin özgün özel durum nesnesi (size aklıma gelen bir şey olarak ikamet eden a magical memory location which will stay valid during the subsequent unwinding -- 0x98e7058 örnek). Ancak

  1. İlk vaka bu yana seni yeniden oluşturma ile throw; (hangi, aksine throw err;, korur, özgün özel durum nesnesi, değişiklikleriniz, "büyülü bir yer" 0x98e7058)eklemek için arama yansıtmaktadır()
  2. Atmak bu yana ikinci durumda, bir şey açıkça, birkopyalaerr oluşturulacak sonra atılan yeni bir farklı "büyülü bir yer" 0x98e70b0 -- çünkü tüm derleyici bilir err bir nesne yığını olmak üzere unwinded gibi e 0xbfbce430, "de" sihirli yer" 0x98e7058),-türetilmiş sınıf özel verilerinizi kaybedersinizkopyala-inşaat temel sınıf örneğinin sırasında.

Basit bir program neler olduğunu göstermek için:

#include <stdio.h>

struct MyErr {
  MyErr() {
    printf("  Base default constructor, this=%p\n", this);
  }
  MyErr(const MyErr& other) {
    printf("  Base copy-constructor, this=%p from that=%p\n", this, &other);
  }
  virtual ~MyErr() {
    printf("  Base destructor, this=%p\n", this);
  }
};

struct MyErrDerived : public MyErr {
  MyErrDerived() {
    printf("  Derived default constructor, this=%p\n", this);
  }
  MyErrDerived(const MyErrDerived& other) {
    printf("  Derived copy-constructor, this=%p from that=%p\n", this, &other);
  }
  virtual ~MyErrDerived() {
    printf("  Derived destructor, this=%p\n", this);
  }
};

int main() {
  try {
    try {
      MyErrDerived e;
      throw e;
    } catch (MyErr& err) {
      printf("A Inner catch, &err=%p\n", &err);
      throw;
    }
  } catch (MyErr& err) {
    printf("A Outer catch, &err=%p\n", &err);
  }
  printf("---\n");
  try {
    try {
      MyErrDerived e;
      throw e;
    } catch (MyErr& err) {
      printf("B Inner catch, &err=%p\n", &err);
      throw err;
    }
  } catch (MyErr& err) {
    printf("B Outer catch, &err=%p\n", &err);
  }
  return 0;
}

Sonuç:

  Base default constructor, this=0xbfbce430
  Derived default constructor, this=0xbfbce430
  Base default constructor, this=0x98e7058
  Derived copy-constructor, this=0x98e7058 from that=0xbfbce430
  Derived destructor, this=0xbfbce430
  Base destructor, this=0xbfbce430
A Inner catch, &err=0x98e7058
A Outer catch, &err=0x98e7058
  Derived destructor, this=0x98e7058
  Base destructor, this=0x98e7058
---
  Base default constructor, this=0xbfbce430
  Derived default constructor, this=0xbfbce430
  Base default constructor, this=0x98e7058
  Derived copy-constructor, this=0x98e7058 from that=0xbfbce430
  Derived destructor, this=0xbfbce430
  Base destructor, this=0xbfbce430
B Inner catch, &err=0x98e7058
  Base copy-constructor, this=0x98e70b0 from that=0x98e7058
  Derived destructor, this=0x98e7058
  Base destructor, this=0x98e7058
B Outer catch, &err=0x98e70b0
  Base destructor, this=0x98e70b0

Ayrıca Bkz:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Distractify

    Distractify

    1 Aralık 2011
  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • RFS Dan

    RFS Dan

    22 Temmuz 2014