2012-04-14 34 views
5

Bazen C++/C'de programlama yaparken, aynı işlevi birden çok kez çağırıyorum ve tüm bu çağrıların hatalarını kontrol etmenin en etkili yolunun ne olduğunu merak ediyordum? if else ifadelerini kullanmak çok fazla kod alıyor ve çirkin görünüyor. Hataları kontrol etmek için kendi yolumla geldim, belki de kullanmam için daha iyi bir yol var.Birçok işlev çağrısı kontrol edilirken hata oluştu

int errs[5] = {0}; 
errs[0] = functiona(...); 
errs[1] = functiona(...); 
... 
errs[5] = functiona(...); 
for (int i = 0; i < 5; i++) 
{ 
    if (err[i] == 0) 
    MAYDAY!_wehaveanerror(); 
} 

Not: Ben ilk hata istisna atarak bu sorunu çözmek gibi try ve catch kullanarak C++ için daha iyi olabileceğini biliyoruz, ama bu sorun, çok uyumlu olmamasıdır Windows API gibi hata kodlarını döndüren işlevler. Teşekkürler!

+1

Haha, sorumu güncellenen :) – user99545

+2

Neden en kısa sürede bir hata oluştuğunda biliyorum ve bunu elde olarak her dönüş kodunu kontrol etmek istemez ki? Yönteminizi kullanarak, bir dizi hata üretebilir ve yalnızca ilkini öğrenebilirsiniz. –

+0

Geçecek paramatörler listesi üzerinde yineleyin, bu yineleme parametreleriyle işlevi çağırın, bir hata algılandığında ilk kez bir "hatamız var" bool ayarlayın ve döngüyü o anda ve sonra sonlandırın. – DavidO

cevap

2

aynı zamanda tüm bir catch eklemek olursa ....

struct my_exception : public std::exception { 
    my_exception(int); /* ... */ }; 

int main() 
{ 
    try 
    { 
     int e; 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
    } 
    catch (my_exception & e) 
    { 
     std::cerr << "Something went wrong: " << e.what() << "\n"; 
    } 
    catch (...) 
    { 
     //Error Checking 
    } 
} 
5

Böyle bazı sözde C++ yazabilirsiniz: function farklı bir hata atmak için bir şansı var IF

struct my_exception : public std::exception { 
    my_exception(int); /* ... */ }; 

int main() 
{ 
    try 
    { 
     int e; 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
    } 
    catch (my_exception & e) 
    { 
     std::cerr << "Something went wrong: " << e.what() << "\n"; 
    } 
} 
+0

Veya Windows API işlevini hata kodlarını istisnalara dönüştüren ince bir katmanla sarabilirsiniz. Borland Delphi bunu 15 yıl önce yapmıştı, harika çalıştı ve hala harika çalışıyor. –

0

Aynı işlevi tekrar tekrar çağırıyorsanız, en kısa yol bir makro kullanmak olabilir. Ben böyle bir şey öneririm:

#define CHECKERROR(x) if(x == 0) wehaveanerror() 

CHECKERROR(function(...)); 
CHECKERROR(function(...)); 

Açıkçası, bu makro katılan özellikle fonksiyonu ve hata işleyicisi için çok özel olacağını, bu yüzden bu çağrıları sonra undef mantıklı olabilir.

0

daha eski okul yaparak, ancak orijinal hata yanıtı w/tutmak ancak bir hata/çirkin görünümlü o w oluşur en kısa sürede yanıt:

#define callcheck(r) if ((r)==0) MAYDAY!_wehaveanerror() 

callcheck(functiona(...)); 
callcheck(functiona(...)); 
... 
1

Ne işlevinde denetimi ele dersiniz?

void my_function() { 
    if (!create_window()) 
    throw Error("Failed to create window"); 
} 

int main() { 
    try { 
    my_function(); 
    } catch (const Error& e) { 
    cout << e.msg << endl; 
    } catch (...) { 
    cout << "Unknown exception caught\n" 
    } 

    return 0; 
}