13 Kasım 2014 Perşembe

C++ ve Exception

Not : Bu konu ile ilgili olarak Linux Sinyalleri başlıklı yazıya göz atabilirsiniz.

Exception Bilgileri
C++ İle Exception yazısına taşıdım.

Uygulamadan Çıkma Bilgileri

std::terminate()
Bir exception atıldıktan sonra eğer onu yakalayan bir catch() ifadesi yoksa C++ tarafından std::terminate() fonksiyonu çağırılır. Bu fonksiyon da direkt std::abort() fonksiyonunu çağırır . std::abort isminden de belli olduğu gibi SGABRT sinyalinin gönderilmesine sebep olur ve uygulama kapanırken çağırmak üzere atadığı atexit() vs. gibi fonksiyonları işletemeden, yani temizlik yapamadan kapanır. Eğer işletim sisteminde gerekli ayarlar yapılmışsa bir core dosyası oluşturulur.

std::abort()
std::abort yazısına taşıdım.

std::set_terminate()
std::set_terminate yazısına taşıdım.

std::exit()
Aşağıdaki şekli buradan aldım ve std::exit()'in nasıl çalıştığını gösteriyor. Şeklin sadece ortasındaki exit function yazan kısmına bakarsak exit handler'ların çağırıldığı ve standart I/O cleanup yapıldığını görmek mümkün. std::exit() metodunun tek kötü tarafı stack üzerinde yaratılmış olan değişkenlere ait destructor'ların çağırılmaması, yani "Destructors of variables with automatic storage durations are not called." cümlesine dikkat etmek lazım.


Aşağıdaki atexit metodunun kodu var.
int atexit (void (* __func) (void) ) {
  if (atexitCurEntries >= atexitMaxEntries){
     return ERROR;
  }
  pAtexitTable [ atexitCurEntries ].__func = __func;
  atexitCurEntries++;
  return OK;
}
std::_Exit
Bu metod fork() ile başlatılan child process'leri bitirmek için kullanılır. Böylecek atexit() ile kaydedilen metodlar çalıştırılmaz. _Exit() bir C metodudur. _exit() ise POSIX çağrısıdır.

std::quick_exit()
Eğer static desctructorları çağırmak istemiyorsak ancak I/O streamler boşaltılsın istiyorsak std::quick_exit() metodunu da kullanmak faydalı olabilir.

std::atexit()
std::atexit yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder