C中的例外(尝试捕获)

时间:2014-12-10 14:28:54

标签: c exception try-catch

我只是问如何在C中使用Try Catch。我在谷歌搜索,我发现C不支持异常,但我可以使用调用setjmp和longjmp的东西,但我不明白。另外,我知道如何在C ++中使用异常。它是这样的:

#include <iostream>

using namespace std;

main(){
   int opc;
   bool aux=true;
   cin.exceptions(std::istream::failbit);
   do{
   try{
       cout<<"PLEASE INSERT VALUE:"<<endl;
       cin>>opc;
       aux=true;

   }
   catch(std::ios_base::failure& fail){
             aux=false;
             cout<<"PLEASE INSERT A VALID VALUE."<<endl;
             cin.clear();
             std::string tmp;
             getline(cin, tmp);
           }
           }while(aux==false);
 system("PAUSE");
}//main

有关C的任何帮助吗?

2 个答案:

答案 0 :(得分:0)

C中没有这样的事 作为一种解决方法,您可能希望:

  • 将代码置于try下的函数
  • 让函数返回error code
  • 分析返回的代码,并在条件
  • 下放置catch中的内容

示例:

int error = my_try();
if(error == ENOMEM)
{
    printf("Out of memory: Abort\n");
    return -1;
}
else if(error == EINVAL)
{
    printf("Invalid parameter\n");
    return -1;
}
// else error == 0: everything went smoothly

答案 1 :(得分:0)

由于C不支持自动异常,因此最佳做法是检查可能失败的任何函数的返回值。是的,在编写健壮的程序时,通常会编写大量的错误处理代码。

函数setjmp / longjmp支持手动异常(类似于java中的throw),可用于减少必要的检查量。

那么,当我说没有自动例外时,我的意思是什么? 当事情在C中出现严重错误时,该过程会获得一个信号,而不是例外。所以有自动例外,只有机制完全不同。

这意味着在C中你仍然需要检查malloc等函数的返回值,因为setjmp / longjmp不会保护你免受调用未定义行为的影响(比如使用空指针)。