【发布时间】: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