5

有时,当我在 C++/CI 中编程时,最终会多次调用同一个函数,我想知道检查所有这些调用的错误的最有效方法是什么?usingif 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();
}

注意:我知道使用tryandcatch可能对 C++ 更好,因为它会通过在第一个错误时抛出异常来解决这个问题,但问题是它与许多返回错误代码的函数不兼容,例如视窗 API。谢谢!

4

5 回答 5

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";
    }
}
于 2012-04-14T23:48:11.340 回答
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
    }
}
于 2012-04-14T23:53:32.690 回答
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;
}
于 2012-04-15T01:20:41.293 回答
0

如果你一遍又一遍地调用同一个函数,最简洁的方法可能是使用宏。我会建议类似:

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

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

显然,此宏将非常特定于所涉及的特定函数和错误处理程序,因此undef在这些调用之后可能会谨慎行事。

于 2012-04-15T01:10:40.600 回答
0

这样做更老派,但保留原始错误响应,但一旦发生错误就会响应而看起来很难看:

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

callcheck(functiona(...));
callcheck(functiona(...));
...
于 2012-04-15T01:16:14.627 回答