ANSI C相当于try/catch?

aid*_*den 25 c c++ exception-handling try-catch ansi-c

我有一些我正在使用的C代码,我在代码运行时发现错误,但是关于如何正确执行try/catch(如C#或C++)的信息很少.

例如在C++中,我只是这样做:

try{
//some stuff
}
catch(...)
{
//handle error
}
Run Code Online (Sandbox Code Playgroud)

但在ANSI C中,我有点迷失.我尝试了一些在线搜索,但是我没有看到关于如何实现这一点的足够信息/想象我会问这里以防万一有人能指出我正确的方向.

这是我正在使用的代码(相当简单,递归的方法),并希望用try/catch(或等效的错误处理结构)进行包装.

但是我的主要问题是如何在ANSI C中执行try/catch ...实现/示例不必是递归的.

void getInfo( int offset, myfile::MyItem * item )
{
    ll::String myOtherInfo = item->getOtherInfo();
    if( myOtherInfo.isNull() )
        myOtherInfo = "";
    ll::String getOne = "";
    myfile::Abc * abc = item->getOrig();
    if( abc != NULL )
    {
        getOne = abc->getOne();
    }
    for( int i = 0 ; i < offset ; i++ )
    {
             printf("found: %d", i);
    }
    if( abc != NULL )
        abc->release();
    int childCount = item->getChildCount();
    offset++;
    for( int i = 0 ; i < childCount ; i++ )
        getInfo( offset, item->getChild(i) );
    item->release();
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 25

一般来说,你没有.

可以使用setjmplongjmp构建与try/catch非常相似的东西,尽管在C中没有像析构函数或堆栈展开这样的东西,所以RAII是不可能的.您甚至可以使用所谓的"清理堆栈"(参见例如Symbian/C++)来近似RAII,尽管它不是非常接近的近似值,并且它需要做很多工作.

在C中指示错误或失败的常用方法是返回指示成功状态的值.呼叫者检查返回值并相应地采取行动.例如参见标准C函数:printf,read,open,的想法如何指定你的函数.

混合C和C++代码时,必须确保C++异常永远不会到达C代码.编写将从C调用的C++函数时,捕获所有内容.

  • IME通常用于指示C中的错误或失败的方法是返回调用者忽略的值.`(` (19认同)
  • @sbi:IME,有些人仍然认为"返回一个值"是用C++,Java和C#的方式......`:(` (2认同)

Ste*_*end 17

C不支持异常处理.

有一个方法的信息这个问题在这里.这显示了简单的setjmp/longjmp方法,但也提供了更为复杂的替代方案,深入介绍.

  • +1因为投票错误...问题的完美链接 (2认同)