Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中抛出异常? < >我把这个输入到谷歌,但是我只发现了C++中的TOS。_C_Exception_Syntax - Fatal编程技术网

如何在C中抛出异常? < >我把这个输入到谷歌,但是我只发现了C++中的TOS。

如何在C中抛出异常? < >我把这个输入到谷歌,但是我只发现了C++中的TOS。,c,exception,syntax,C,Exception,Syntax,如何在C中执行此操作?在C中没有异常。在C中,错误由函数的返回值、进程的退出值、进程的信号()或CPU硬件中断(或CPU的其他通知错误,如果有)通知() 异常是用C++和其他语言定义的。C++中的异常处理是在C++标准“S.15异常处理”中指定的,C标准中没有等价的部分。 < P> C没有例外。 有各种各样的黑客实现试图做到这一点(例如:)。普通的旧C实际上不支持本机异常 您可以使用其他错误处理策略,例如: 返回错误代码 返回FALSE并使用last\u错误变量或函数 请参阅。C不支持异常。

如何在C中执行此操作?

在C中没有异常。在C中,错误由函数的返回值、进程的退出值、进程的信号()或CPU硬件中断(或CPU的其他通知错误,如果有)通知()


异常是用C++和其他语言定义的。C++中的异常处理是在C++标准“S.15异常处理”中指定的,C标准中没有等价的部分。

< P> C没有例外。
有各种各样的黑客实现试图做到这一点(例如:)。

普通的旧C实际上不支持本机异常

您可以使用其他错误处理策略,例如:

  • 返回错误代码
  • 返回
    FALSE
    并使用
    last\u错误
    变量或函数

请参阅。

C不支持异常。您可以尝试编译C代码为C++,使用VisualStudio或G++,并查看它是否会按原样编译。大多数C应用程序将编译为C++而不进行重大更改,然后可以使用TIE…捕获语法。

在使用Microsoft Visual C++(MSVC)的Windows上,有
\uuuu尝试__除了…
,但它真的很可怕,如果你可以避免的话,你不想使用它。最好说没有例外。

在C中,您可以使用
setjmp()
longjmp()
函数的组合,这些函数在
setjmp.h
中定义

#包括
#包括
静态jmp_buf buf;
第二个无效(无效){
printf(“第二个\n”);//打印
longjmp(buf,1);//跳回setjmp所在的位置
//被调用-使setjmp现在返回1
}
先作废(作废){
第二个();
printf(“first\n”);//不打印
}
int main(){
如果(!setjmp(buf)){
first();//执行时,setjmp返回0
}else{//当longjmp跳回时,setjmp返回1
printf(“main”);//打印
}
返回0;
}

<强> > 我会建议您使用“强>不<强”来使用它们,因为它们对C++工作非常糟糕(本地对象的析构函数不会被调用),而且很难理解正在发生的事情。返回某种错误。

C中没有内置的异常机制;您需要模拟异常及其语义。这通常通过依赖
setjmp
longjmp
来实现


周围有很多库,我正在实现另一个库。它叫,;它是便携式的,免费的。你可以看一看,然后比较一下哪个最适合你。

这个问题非常古老,但我只是偶然发现了它,并认为我应该分享一种技巧:除以零,或者取消引用空指针


问题只是“如何抛出”,而不是如何捕获,甚至是如何抛出特定类型的异常。我很久以前就有过这样的情况,我们需要从C中触发一个异常来捕获C++。具体来说,我们偶尔会报告“纯虚拟函数调用”错误,需要说服C运行时的_purecall函数抛出一些东西。因此,我们添加了自己的“0”函数,它被零除,并且,我们得到了一个异常,我们可以捕捉到C++,甚至使用一些堆栈的乐趣来查看错误所在。

正如许多线程中提到的,“标准”的方式是使用SETJMP/LIJMP。我将另一个这样的解决方案发布到


据我所知,这是唯一依赖于自动清理已分配资源的解决方案。它实现了唯一的和共享的智能指针,并允许中间函数允许异常通过而不捕获,并且仍然使其本地分配的资源被正确清理。

C能够抛出C++异常。反正是机器代码

例如,在文件bar.c中:

输出
很好
有关于
的更多详细信息


我不确定它是否可移植,我在Linux上使用“gcc-4.8.2”对其进行了测试。

如果您使用设计模式(例如,对于嵌入式设备)编写代码,您可以使用运算符“goto”模拟异常错误处理(也称为deffering或finally emulation)

它实际上不是一个异常处理程序,但它为您提供了一种在函数退出时处理错误的方法

注意:您应该注意仅从相同或更深层的作用域使用goto,并且不要跳转变量声明。

by

第四章由汉森撰写

道格·莫恩


(详见E.Roberts的文章)

C不支持异常处理。要在C中引发异常,您需要使用特定于平台的东西,如Win32的结构化异常处理——但要提供任何帮助,我们需要了解您关心的平台……不要使用Win32结构化异常处理。使用setjmp()和longjmp()理论上应该可以,但是我认为不值得这么麻烦。所以在C中保证不会有异常,怎么做?@httpexplant:C中“保证”没有异常,就像“保证”没有模板、没有反射或没有独角兽一样。语言规范根本没有定义任何这样的东西。不过,还有setjmp/longjmp,可用于退出函数而不返回。所以程序可以建立自己的异常机制,如果C语言实现了定义的扩展,则在代码< >代码> C >代码>文件中可以包含一些C++,因此可以在程序中抛出和捕获异常。但是C代码部分仍然不知道所有这些,除了异常抛出和捕获通常依赖于用
#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

void second(void) {
    printf("second\n");         // prints
    longjmp(buf,1);             // jumps back to where setjmp 
                                //   was called - making setjmp now return 1
}

void first(void) {
    second();
    printf("first\n");          // does not print
}

int main() {   
    if ( ! setjmp(buf) ) {
        first();                // when executed, setjmp returns 0
    } else {                    // when longjmp jumps back, setjmp returns 1
        printf("main");         // prints
    }

    return 0;
}
#include <stdlib.h>
#include <stdint.h>

extern void *__cxa_allocate_exception(size_t thrown_size);
extern void __cxa_throw (void *thrown_exception, void* *tinfo, void (*dest) (void *) );
extern void * _ZTIl; // typeinfo of long

int bar1()
{
   int64_t * p = (int64_t*)__cxa_allocate_exception(8);
   *p = 1976;
   __cxa_throw(p, &_ZTIl, 0);
  return 10;
}
#include <stdint.h>
#include <cstdio>
extern "C" int bar1();

void foo()
{
  try
  {
    bar1();
  }
  catch(int64_t x)
  {
    printf("good %ld", x);
  }
}

int main(int argc, char *argv[])
{
  foo();
  return 0;
}
int process(int port)
{
    int rc;
    int fd1;
    int fd2;

    fd1 = open("/dev/...", ...);
    if (fd1 == -1) {
      rc = -1;
      goto out;
    }

    fd2 = open("/dev/...", ...);
    if (fd2 == -1) {
      rc = -1;
      goto out;
    }

    // Do some with fd1 and fd2 for example write(f2, read(fd1))

    rc = 0;

   out:

    //if (rc != 0) {
        (void)close(fd1);
        (void)close(fd2);
    //}

    return rc;
}