我们的代码(在一个简单的库实现中)开始看起来像这样:
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预处理器?我是这样想的:
CHECK callToUnderlyingLibrary1();
CHECK callToUnderlyingLibrary2();
CHECK callToUnderlyingLibrary3();其中,CHECK宏调用该函数并执行基本的错误检查。
有没有更好的惯用方式来处理这个问题?
发布于 2011-08-04 04:54:34
另一种基于宏的方法,可以用来相当容易地消除C语言的缺点:
#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)然后,要调用它,您需要:
CHECK(doSomething1());
CHECK(doSomething2());
// etc.为了获得额外的积分,您可以很容易地扩展CHECK宏来接受第二个参数y,这是在失败时要做的事情:
#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")):发布于 2011-08-04 04:02:05
通常,在C语言中,人们使用goto进行错误处理:
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;
}这可以通过宏和更巧妙的指令流来改进(以避免重复清理代码),但我希望您能明白这一点。
发布于 2011-08-04 03:54:51
我认为你应该看看异常和异常处理。http://www.cplusplus.com/doc/tutorial/exceptions/
try{
callToUnderlyingLibrary1();
callToUnderlyingLibrary2();
callToUnderlyingLibrary3();
}catch(exception& e)
//Handle exception
}如果出现错误,库函数可能会抛出异常
https://stackoverflow.com/questions/6932401
复制相似问题