2014-10-17 19 views
6

Özel durum yakalama-atımlarını kullanarak başvurumda hata ayıklamaya çalışıyorum. Benim istisna işleme kodum hata ayıkladığım bazı bloklardan daha uzun ve hepsi kopyalanmış.İstisna kodu DRY nasıl yapılır?

Aşağıdaki kodu tekrar tekrar ifade etmenin daha iyi bir yolu var mı? Makroların buraya gitmesinin bir yolu olduğundan şüpheleniyorum ama genelde veba gibi makrolardan kaçınıyorum.

try { 
    // Code here... 
    } 
    catch (std::exception & e) 
    { 
    ErrorMsgLog::Log("Error", "std exception caught in " __func__ " " __FILE__ " " __LINE__, e.what()); 
    throw e; 
    } 
    catch (Exception & e) 
    { 
    ErrorMsgLog::Log("Error", "Builder exception caught in " __func__ " " __FILE__ " " __LINE__, e.Message); 
    throw e; 
    } 
    catch (...) 
    { 
    ErrorMsgLog::Log("Error", "Unknown exception caught in " __func__ " " __FILE__ " " __LINE__); 
    throw std::runtime_error ("Unknown Exception in " __func__ " " __FILE__ " " __LINE__); 
    } 
+2

'templated işleve tüm istisnalar forward': Burada uygulamak nasıl olduğunu? – user2485710

+4

Herhangi bir akıl istisna türü olduğu gibi 'stception :: istisna 'bir alt türü olan' stception' istisnasıdır. – rightfold

+0

1. Bu C++ 11 değil. İletilemez. 2. Özel durum Borland C++ Builder sınıfıdır. Ayrıca, ben * sadece * std :: istisnası ele alınmış olsa bile, hala kopya-yapıştırmaktan kurtulmak istiyorum. – QuestionC

cevap

0

Bunu gerçekleştirmenin en iyi yolu, muhtemelen makroları kullanmaktır. Makro tanımı biraz çirkin, ancak makroyu çağırmak oldukça kolay olacak ve kodunuzu yeniden düzenlemenize gerek kalmayacak. makroları kullanmayı değil gerçekten kararlılar Eğer @juanchopanza önerdiği yaklaşım kullanmak ve sürer kontrol için daha yüksek dereceden işlevini kullanabilirsiniz,

#define RUN_SAFE(code) try {\ 
    code\ 
    }\ 
    catch (std::exception & e)\ 
    {\ 
    ErrorMsgLog::Log("Error");\ 
    throw e;\ 
    }\ 
    catch (Exception & e)\ 
    {\ 
    ErrorMsgLog::Log("Error");\ 
    throw e;\ 
    }\ 
    catch (...)\ 
    {\ 
    ErrorMsgLog::Log("Error");\ 
    throw std::exception();\ 
    }\ 

int main(){ 
    RUN_SAFE(
    cout << "Hello World\n"; 
) 
} 

: Burada uygulamak nasıl gösteren bir örnek olduğu parametre olarak kod. Bu yaklaşım muhtemelen kodunuzu biraz değiştirmenizi gerektirecektir.

void helloWorld(){ 
    cout << "Hello World\n"; 
} 

void runSafe(void (*func)()){ 
    try { 
     func(); 
    } 
    catch (std::exception & e) 
    { 
     ErrorMsgLog::Log("Error"); 
     throw e; 
    } 
    catch (Exception & e) 
    { 
     ErrorMsgLog::Log("Error"); 
     throw e; 
    } 
    catch (...) 
    { 
     ErrorMsgLog::Log("Error"); 
     throw std::exception(); 
    } 
} 

int main(){ 
    runSafe(helloWorld); 
} 
+0

C++ kullandığınızdan, bir ham işlev işaretçisi yerine bir 'std :: function 'kullanın. Işlev argüman türü ve dönüş tipi için şablon argümanlarını kullanın. –