2012-04-14 48 views
5

有时,当我在C++/C编程时,我最终调用了多次相同的函数,我想知道检查所有这些调用错误的最有效方法是什么?使用if else语句会占用大量代码,并且看起来很难看。我已经想出了自己的方法来检查错误,也许我应该使用更好的方法。错误检查许多函数调用

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(); 
} 

注:据我所知,使用trycatch可能对C更好++,因为它会通过在第一个错误抛出异常的解决了这个问题,但这个问题是,它是不是有很多兼容的函数返回错误代码,如Windows API。谢谢!

+1

哈哈,更新我的问题:) – user99545 2012-04-14 23:39:11

+2

为什么不是你想尽快发生错误时知道的,检查每个返回代码,你明白吗?使用你的方法,你可能会产生一系列的错误,只能找出第一个错误。 – 2012-04-14 23:40:37

+0

遍历要传递的参数列表,使用该迭代的参数调用该函数,在第一次检测到错误时将“我们有错误”布尔值设置为true,然后立即终止循环。 – DavidO 2012-04-14 23:43:03

回答

2

如果...如果函数有机会抛出一个不同的错误,你应该也都加一个陷阱。

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

你可以写一些伪C++这样的:

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

或者您可以使用薄层将Windows API函数封装起来,以将错误代码转换为异常。 Borland Delphi在15年前完成了这项工作,它运行良好,仍然非常棒。 – 2012-04-15 06:44:28

0

如果你一遍又一遍地调用同一个功能,最简洁的方式可能是使用宏。我建议是这样的:

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

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

显然,这个宏将是非常具体所涉及的具体功能和错误处理程序,所以这些电话后,可以谨慎地undef它。

0

做更老派,但保持W /原来的错误反应,但由于发生错误的W/O面色难看尽快回应:

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

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

有关的功能处理检查什么?

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; 
}