【问题标题】:exception handling in C++ never catches baisc type of exception, always result in segmentation faultC++ 中的异常处理从不捕获 baisc 类型的异常,总是导致分段错误
【发布时间】:2014-09-12 18:02:06
【问题描述】:

我精通 C,并且了解 C++ 和 g++ 的基础知识来执行我的代码。 我正在尝试在 C++ 中捕获异常。 我在 try 部分的代码主要是 C 代码。 我写道:

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

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

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

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

while(1);     // stack overflow   

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

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

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

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

这给了我一些垃圾价值 cout 这给了我段错误

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

我在网站上阅读了很多。我了解 C++ 不会将分段错误作为异常处理。

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

这里我有几个问题:

1) 不能 C++ 抛出异常,不使用 throw 语句或异常函数。 2)为了测试我的代码,我正在寻找例如导致堆栈溢出、数组超出键、除以零或任何类型的异常。有人可以举一些例子吗

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++ 运行我的程序,但我得到的只是分段错误,以防出现异常。

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

【问题讨论】:

  • 未定义的行为是未定义的。这些例子都不需要做任何事情。
  • while(1);不是堆栈溢出,是无限循环
  • catch 只捕获throw 抛出的异常。它不会神奇地检测到所有未定义的行为。
  • 如果您的大部分代码如您所说的那样是 C,catch 不会给您买任何东西,因为这些代码部分永远不会抛出任何可能被抓住。
  • 谢谢大家...我理解这个问题。我会采取相应措施

标签: c++ exception segmentation-fault g++ throw


【解决方案1】:
  1. 没有。您实际上可以在大多数编译器中关闭 throw 支持。与 C 的互操作性是您可能想要这样做的原因之一。 C 根本不支持 throw。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多