2010-12-10 10 views
14

Yönetilmeyen C++, Visual Studio 2008 veya daha yeni bir proje oluşturuyorsam, hangi istisna işleme modeli ile gitmek istiyorum?Visual C++ Yönetilmeyen Kod: C++ istisnaları için/EHa veya/EHsc kullanın?

Ben az verimli kodunda olduğu/EHA opsiyon sonuçlarını anlamak ve ayrıca sağ, SEH durumları yakalar?

Bu yüzden, bu seçeneği açıkça görüyorum ve normalde/EHsc ile gidiyordum, böylece yalnızca erişimde bulunan C++ istisnalarını ve erişim ihlallerini ve diğer yapılandırılmış yürütmeleri yakalamamı yakalarım, (...) işleyicileri. Kodumda bir erişim ihlali varsa, bir yakalama (...) {} ile maskelenmesini istemiyorum. catch (...) diğerleri ile

Ben kodu {} hiçbir şey yapmamak ve hatta bana gerçekten kötü bir fikir gibi görünen bir erişim ihlali söz konusuysa, bunu yapmak istiyorum. Kötü kodlama nedeniyle bir hata varsa, parmaklarınızı kulağınıza yapıştırmak ve yüksek sesle "La la la la la!" böylece program çökmesine sahip olmak zorunda değilsiniz? Aslında, kod artık bir kodlama hatası nedeniyle kötü durumda ise, kodun devam etmesini gerçekten istiyor musunuz?

Genel düşüncem/EHa daha büyük/daha yavaş kodlar yaratıyor ve programcıların ölümcül bir hata varsa, tanımlanamayan bir durumda çalışmaya devam edecekleri yazma kodundan kurtulmalarını sağlıyor.

BTW, biz çoğunlukla yazarken ne olduğu uygulamalar ve hizmet kodu bahsediyorum. Düşük seviye olmayan aygıt sürücüleri veya bunun gibi bir şey.

Lütfen düşüncelerinize dikkat edin.

cevap

16

/EHa iki şeyi yapar. İlk olarak ve en önemlisi, kod analizcinin bir C++ istisnası atabilecek herhangi bir kodu görememesi durumunda, yerel sınıf değişkenlerini otomatik olarak yok eden istisna filtrelerini yok eden bir optimizasyonu bastırır. Bu, yığının yalnızca C++ istisnası değil, herhangi bir istisna için güvenli hale getirilmesini sağlar. Bu istisna filtreleri için ek yük, x86 ve x86 ve x64'teki alanlar içindir.

Ve evet, bu catch davranışını (...) değiştirir, artık aynı zamanda herhangi bir SEH istisna değil, sadece C++ filtreler. Bu gerçekten bir kumardır, çünkü tüm kötü şeyleri, asenkron donanım istisnalarını yakalarsınız. Kişisel olarak C++ istisnalarını yakalamanın çok savunmasız olduğunu düşünmeme rağmen, program durumunun ne derece değiştiği ve neden başarısız olduğu konusunda hala belirsiz bir fikrin var.

Gerçekçi olarak, __try/__except'u kullanarak kendi istisna filtrenizi yazıp kötü olanları yakalayamamanız için geçiş yapmanız gerekir. C++ istisnaları için istisna kodu 0xe04d5343'tür ("MSC"). _set_se_translator() kullanımı başka bir yaklaşım olacaktır.

4

/EHa'yı kullanıyorum çünkü .NET birlikte çalışırken güvenli,/EHsc olmayabilir; örneğin Destructors not called when native (C++) exception propagates to CLR component'a bakın. belirli bir kod biraz ekstra performans gerçekten önemli ve .NET (veya herhangi başka) uyumluluğu, daha sonra emin gerekmiyorsa

Ancak,/EHsc ince geliyor.

/EHsc ne de/EHA Ne böylece erişim ihlallerini yakalamak için bu kullanarak, en bellek hataları yakalamak umutsuz bir durumdur.

+2

Hiçbir durumda erişim ihlallerini yakalamaya çalışmamalısınız. –

+1

Bu benim anlayışım ... ama insanlar yakaladım (...) {} ve eğer/EHa seçildiyse, o zaman bu inanıyorum erişim ihlalini gömecektir. Yakalanması gereken bir şey var (...) {cleanup_stuff; atmak; } Ancak bu durumda bile, yakalanan bir erişim ihlali ise, cleanup_stuff işini yapacak olduğundan emin misiniz? Kötü bir durumdasınız, bu yüzden muhtemelen programın orada çöküşün en iyisi olduğunu düşünürdüm. – MarkS

+3

İstemcinde/sunucu sisteminde çalışıyorum, eğer sunucuda bir istisna varsa (ideal olarak, erişim ihlali de dahil olmak üzere herhangi bir istisna), sunucu zincirinin çökmesine izin vermeden önce istemciye istisna mesajını göndermek istiyorum. Aksi halde, sunucu yanıt vermiyor. –