SORU
17 EYLÜL 2008, ÇARŞAMBA


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:

  1. 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.
  2. Eğer bir işlevi bir özel durum belirtici ihlal ederse, standart davranış programı sonlandırmak için olduğunu düşünüyorum.
  3. 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
18 EYLÜL 2008, PERŞEMBE


Hayır.

Burada neden birkaç örnek:

  1. Ş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.

  2. İ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.

  3. 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.

  4. 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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • chickenby

    chickenby

    2 HAZİRAN 2008
  • Miles Fisher

    Miles Fisher

    8 NİSAN 2009
  • TotalxLuna

    TotalxLuna

    27 Kasım 2011