首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优雅的错误检查

优雅的错误检查
EN

Stack Overflow用户
提问于 2011-08-04 03:51:08
回答 7查看 10.4K关注 0票数 27

我们的代码(在一个简单的库实现中)开始看起来像这样:

代码语言:javascript
复制
err = callToUnderlyingLibrary1();
if (err!=0) {
printf ("blah %d\n", err);
...
}

err = callToUnderlyingLibrary2();
if (err!=0) {
printf ("blah %d\n", err);
...
}

err = callToUnderlyingLibrary3();
if (err!=0) {
printf ("blah %d\n", err);
...
}

这既繁琐又丑陋。有没有更好的方法来做这件事?也许使用C预处理器?我是这样想的:

代码语言:javascript
复制
CHECK callToUnderlyingLibrary1();
CHECK callToUnderlyingLibrary2();
CHECK callToUnderlyingLibrary3();

其中,CHECK宏调用该函数并执行基本的错误检查。

有没有更好的惯用方式来处理这个问题?

EN

回答 7

Stack Overflow用户

发布于 2011-08-04 04:54:34

另一种基于宏的方法,可以用来相当容易地消除C语言的缺点:

代码语言:javascript
复制
#define CHECK(x) do { \
  int retval = (x); \
  if (retval != 0) { \
    fprintf(stderr, "Runtime error: %s returned %d at %s:%d", #x, retval, __FILE__, __LINE__); \
    return /* or throw or whatever */; \
  } \
} while (0)

然后,要调用它,您需要:

代码语言:javascript
复制
CHECK(doSomething1());
CHECK(doSomething2());
// etc.

为了获得额外的积分,您可以很容易地扩展CHECK宏来接受第二个参数y,这是在失败时要做的事情:

代码语言:javascript
复制
#define CHECK(x, y) do { \
  int retval = (x); \
  if (retval != 0) { \
    fprintf(stderr, "Runtime error: %s returned %d at %s:%d", #x, retval, __FILE__, __LINE__); \
    y; \
  } \
} while (0)

// We're returning a different error code
CHECK(someFunction1(foo), return someErrorCode);
// We're actually calling it from C++ and can throw an exception
CHECK(someFunction2(foo), throw SomeException("someFunction2 failed")):
票数 18
EN

Stack Overflow用户

发布于 2011-08-04 04:02:05

通常,在C语言中,人们使用goto进行错误处理:

代码语言:javascript
复制
int foo()
{
    if (Function1() == ERROR_CODE) goto error;
    ...
    struct bar *x = acquire_structure;
    ...
    if (Function2() == ERROR_CODE) goto error0;
    ...

    release_structure(x);
    return 0;

error0:
    release_structure(x);

error:
    return -1;
}

这可以通过宏和更巧妙的指令流来改进(以避免重复清理代码),但我希望您能明白这一点。

票数 16
EN

Stack Overflow用户

发布于 2011-08-04 03:54:51

我认为你应该看看异常和异常处理。http://www.cplusplus.com/doc/tutorial/exceptions/

代码语言:javascript
复制
try{    
    callToUnderlyingLibrary1();
    callToUnderlyingLibrary2();
    callToUnderlyingLibrary3();
}catch(exception& e)
    //Handle exception
}

如果出现错误,库函数可能会抛出异常

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6932401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档