C özel durum belirtici kullanmalıyım ?
C fonksiyonu olabilir ya da bir özel durum belirteci kullanarak bir özel durum olmadığını belirtebilirsiniz. Örneğin:
void foo() throw(); // guaranteed not to throw an exception
void bar() throw(int); // may throw an exception of type int
void baz() throw(...); // may throw an exception of some unspecified type
Aslında şu yüzden onları kullanma konusunda kuşkuluyum:
- Derleyici gerçekten çok faydası olacak yani herhangi titiz bir şekilde özel durum belirteçleri zorlamak değil. İdeal olarak, bir derleme hatası almak istiyorum.
- Eğer bir işlevi bir özel durum belirtici ihlal ederse, standart davranış programı sonlandırmak için olduğunu düşünüyorum.
- Standart bağlılığı güçlü değildir. vs.net at gibi at(X) değerlendirir(...),
Durum belirteçleri kullanılması gerektiğini düşünüyor musunuz?
Cevap "" ya da "hayır" cevabını haklı çıkarmak için bazı nedenler bulunur. Evet lütfen
CEVAP
Hayır.
Burada neden birkaç örnek:
Şablon kod imkansız istisna özellikleri ile yazmaktır
template<class T> void f( T k ) { T x( k ); x.x(); }
Kopyalar atabilir parametre geçirmeden atabilir ve
x()
bilinmeyen bir istisna olabilir.İstisna-teknik özellikler kullanildigini yasaklama eğilimindedir.
virtual void open() throw( FileNotFound );
dönüşebilir
virtual void open() throw( FileNotFound, SocketNotReady, InterprocessObjectNotImplemented, HardwareUnresponsive );
Gerçekten bu gibi yazabilirsiniz
throw( ... )
İlk genişletilebilir değil, aşırı iddialı ikinci ve üçüncü sanal fonksiyonları yazarken ne demek, ne gerçekten.
Eski kod
Başka bir kütüphane dayanan kod yazarken, gerçekten bir şey korkunç yanlış gittiğinde ne yaptığını bilmiyorsun.
int lib_f(); void g() throw( k_too_small_exception ) { int k = lib_f(); if( k < 0 ) throw k_too_small_exception(); }
g
lib_f()
atar zaman sonlandırabilir. Bu gerçekten ne istediğini (çoğu durumda) değildir.std::terminate()
asla çağrılmalıdır. Her zaman daha iyi olan yığın izleme, daha sessizce/bir alabilirsiniz işlenmeyen bir özel durum, uygulama kazasında vahşice ölüme terk etmek.Genel hatalar döndüren kod yazmak ve olağanüstü durumlarda atar.
Error e = open( "bla.txt" ); if( e == FileNotFound ) MessageUser( "File bla.txt not found" ); if( e == AccessDenied ) MessageUser( "Failed to open bla.txt, because we don't have read rights ..." ); if( e != Success ) MessageUser( "Failed due to some other error, error code = " itoa( e ) ); try { std::vector<TObj> k( 1000 ); // ... } catch( const bad_alloc& b ) { MessageUser( "out of memory, exiting process" ); throw; }
Kütüphane sadece kendi özel durumlar atar yine de, zaman, durum özellikleri niyetiniz devlet için kullanabilirsiniz.
Eğer bir özel durum sona değil, Akka A...
Nasıl kullanarak özel durum işleme içi...
'in Görev bir özel durum(lar) da ...
Boş bir İşaretçi Alıcı özel Durum Kodu...
Nasıl küresel iPhone özel Durum İşleme...