如何在C中抛出异常? < >我把这个输入到谷歌,但是我只发现了C++中的TOS。
如何在C中执行此操作?在C中没有异常。在C中,错误由函数的返回值、进程的退出值、进程的信号()或CPU硬件中断(或CPU的其他通知错误,如果有)通知()如何在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++标准“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;
}