c++中的异常处理从来没有捕捉到基本类型的异常,总是导致分段错误

exception handling in C++ never catches baisc type of exception, always result in segmentation fault

本文关键字:异常 错误 分段 类型 从来没有 异常处理 c++      更新时间:2023-10-16

我擅长C语言,并且知道c++和c++的基础知识来执行我的代码。我正在尝试在c++中捕获异常。我在try部分的代码大部分是C代码。我写:

try{
  ....
}
catch (std::exception& e)
{
  std::cerr << "exception caught: " << e.what() << 'n';
}

在try部分,我尝试了几个错误的代码:

char str[3];
free(str);   // Memory Violation  

这给了我分割错误和程序终止

while(1);     // stack overflow   

this持续运行了很长时间。我做了^c来中止它

int x = 5/0;    // divide by 0 exception 

这给了我一些随机的或零的值。

int arr[5];
cout<<arr[100]     // array out of bound   

这给了我一些垃圾值cout<& lt;Arr[1000]//内存违规
这导致了segfault

我不想使用,throw语句。我想保护我的代码,以防我抛出任何随机值错误,我的程序应该捕获它,打印它,然后继续下一项。

我在网上读了很多书。我知道c++不处理分段错误作为一个例外。

我的大部分代码将在c。在某些情况下,我将使用std: vector/std: string我不想使用throw,

这里我有几个问题:

1)不使用throw语句或异常函数,c++不能抛出异常。2)测试我的代码,我正在寻找的例子,导致,堆栈溢出,数组脱离bond,除零或任何类型的异常。谁能举几个例子?

3)在c++中try catch只适用于特定于STD的异常处理吗?

后来我也尝试使用set_terminate和set_unexpected:

使用以下代码:

typedef void (*pfv)();
void my_terminate()
{      cout << "Call to my terminate" << endl; }
void my_unexpected()
{      cout << "Call to my unexpected" << endl; }
int  Divisor()
{
    int result;
    result = number%num;
    if (result == 0 && num < 21)
    {
            num+1;
            Divisor();
            if (num == 20 && result == 0)
            {
                    return number;
            }
    }
    else if (result != 0)
    {
            number++;
            Divisor();
    }
}
int main ()
{
  pfv old_term = set_terminate(my_terminate);
  pfv old_unex = set_unexpected(my_unexpected);
    Divisor();
}

这应该通过set_terminate

向my_unexpected调用输出结果

但是我有分段错误。

我用g++来运行我的程序,所有我得到的是分割错误作为异常情况下的结果。

似乎我错过了一些基本的和重要的例外。需要一些输入

  1. 。实际上,您可以在大多数编译器中关闭抛出支持。与C语言的互操作性是您可能想要这样做的原因之一;C不支持throw

  2. 与Java或c#不同,没有检测这些条件的中间代码解释器,因此它们不会在发生异常时抛出异常。C和c++更接近硬件;在处理器级别,没有"throw"构造,也没有堆栈展开。

  3. 。在c++中,你可以抛出任何东西;整数、指针、引用、对象……你说吧。您不必扩展std::exception。当您大量使用可能抛出std::exception的标准库时,捕获std::exception是有用的,但如果您不想使用它,则没有理由必须使用它。