iptal etmek, feshetmek ya da çıkmak?
Üç olanlar arasındaki fark nedir ve nasıl düzgün kaldıramıyorum hangi özel durumda program sona erer miyim?
CEVAP
iptalgösterir "anormal" son program ve yükseltir POSIX sinyal SİGABRT, başka bir deyişle, herhangi bir eylemci var kayıtlı sinyal olacak çağrılan, ancak program hala sonlandırmak sonraları her iki durumda da. Genellikle kullanırsınız
abort
C program çıkışına beklenmeyen bir hata durumunda hatanın nerede olması muhtemeldir bir hata programı, yerine bir şey gibi kötü bir giriş veya bir ağ hatası. Örneğin, eğer bir veri yapısı mantıksal olarak asla olmamalı ne zaman BOŞ bir işaretçi varsa, 1**.çıkın"bu hala bir hata (hata) göstergesi olabilir ancak. programın sonunda, normal gösterir Diğer bir deyişle, Eğer kullanıcı ayrıştırılması giriş yaptı 2 ** bir hata kodu ile birlikte olabilir, ya da bir dosya okunamadı. Çıkış kodu 0 başarı gösterir.
exit
isteğe bağlı olarak, program sona ermeden önce işleyicileri aramalar da. Buatexit
ve 5 *işlevleri ile kayıtlı.::std sonlandırınişlenmeyen bir özel durum var. otomatik olarak C programına çağırdı. Bu aslında C ** 6, fırlatma istisnalar sayesinde bütün olağanüstü hataları da olduğunu varsayarsak eşdeğerdir. Bu, varsayılan olarak sadece
abort
aramalarstd::set_terminate
işlevi tarafından ayarlanan bir işleyicisi çağırır.
C , genellikle önlemek istiyorsanız arama abort
exit
hata, beri siz en iyisi atma bir istisna ve izin verdiğin kod daha yukarı çağrı yığını olup olmadığı bitiş programdır uygun. Ya kullansanız da kullanmasanız da başarı için exit
ya da algılama programı bir yere main
dönmek deyimi dışında bir amaçla yapar olup olmadığını durum - meselesidir.
std::terminate
son çare hata raporlama aracı, hatta C düşünülmelidir . std::terminate
ile sorun sonlandırma işleyicisi yokdeğilişlenmeyen giden özel erişim, ne olduğunu anlatmak için bir yolu yok. Genellikle try { } catch (std::exception& ex) { }
blok ana bütününü sarma off çok daha iyisin. En azından o zaman std::exception
türetilen bu özel durumlar hakkında daha fazla bilgi (tabii ki, ancak std::exception
türetmek değil istisna hala işlenmeyen sona ereceğini) şikayet edebilirsiniz.
try { } catch(...) { }
main
vücut sarma yine söz konusu durum için erişim yok çünkü bir handler ayarı sonlandırmak daha iyi değil.Düzenleme:Neil Butterworth cevabı başına, bir yığın halinde bu durumda çözülmemiş, (biraz şaşırtıcı) işlenmeyen bir özel durum için doğru değil, bu bir yararı yoktur.
Jelly Bean DatePickerDialog --- iptal ...
Nasıl bekliyor bir Görevi iptal etmek ...
İptal etmek için İdeal şekilde yürütül...
Nasıl AngularJS $http isteği iptal etm...
Nasıl angularJS yayın bir olay üyeliği...