有时当我用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();
}
注意:我理解使用try
和catch
可能对C ++更好,因为它会通过在第一个错误上抛出异常来解决这个问题,但问题在于它不是兼容许多返回错误代码的函数,例如Windows API。谢谢!
答案 0 :(得分: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";
}
}
答案 1 :(得分:2)
如果...如果函数有机会抛出不同的错误,你还应该添加一个catch。
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
}
}
答案 2 :(得分: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;
}
答案 3 :(得分:0)
如果你一遍又一遍地调用同一个函数,最简洁的方法可能是使用宏。我会建议像:
#define CHECKERROR(x) if(x == 0) wehaveanerror()
CHECKERROR(function(...));
CHECKERROR(function(...));
显然,这个宏对于所涉及的特定函数和错误处理程序非常具体,因此在这些调用之后undef
可能是谨慎的。
答案 4 :(得分:0)
做得更老,但保持原始的错误响应,但一旦发生错误就会立即响应,看起来很难看:
#define callcheck(r) if ((r)==0) MAYDAY!_wehaveanerror()
callcheck(functiona(...));
callcheck(functiona(...));
...