gpt4 book ai didi

c++ - C++ 中的异常处理从不捕获基本类型的异常,总是导致段错误

转载 作者:行者123 更新时间:2023-11-28 06:46:39 24 4
gpt4 key购买 nike

我精通 C,并且了解 C++ 和 g++ 的基础知识来执行我的代码。我正在尝试在 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   

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

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

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

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

这给了我一些垃圾值 cout<< arr[1000]///内存冲突
这给了我段错误

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

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

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

这里我有几个问题:

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

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++ 更接近于硬件;在处理器级别,没有“抛出”构造,也没有堆栈展开。

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

关于c++ - C++ 中的异常处理从不捕获基本类型的异常,总是导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24878533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com