1

我的操作系统是 Win8
,使用 Code::Blocks 12.10

我正在尝试使用
从 C++ 早期对象开始 Addison Wesley 中的示例来处理抛出和处理异常。

这是我正在使用的简单代码:

// This program illustrates exception handling
#include <iostream>
#include <cstdlib>

using namespace std;

// Function prototype
double divide(double, double);

int main()
{
    int num1, num2;
    double quotient;

    //cout << "Enter two integers: ";
    //cin >> num1 >> num2;

    num1 = 3;
    num2 = 0;

    try
    {
        quotient = divide(num1,num2);
        cout << "The quotient is " << quotient << endl;
    }
    catch (char *exceptionString)
    {
        cout << exceptionString;
        exit(EXIT_FAILURE);     // Added to provide a termination.
    }
    cout << "End of program." << endl;
    return 0;
  }

 double divide(double numerator, double denominator)
 {
    if (denominator == 0)
        throw "Error: Cannot divide by zero\n";
    else
        return numerator/denominator;
 }

程序将编译,当我使用两个 int > 0 时执行是正常的。但是,如果我尝试除以 0,则会收到以下消息:

terminate called after throwing an instance of 'char const*'

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Process returned 255 (0xFF)   execution time : 4.485 s
Press any key to continue.

我查看了其他示例,但还没有找到类似的代码来得出答案。

有什么建议吗?

4

1 回答 1

1

C++ 标准中有一个引人注目的例子,[except.throw]/1:

例子:

throw "Help!";

可以被以下类型的处理程序const char*捕获:

try {
    // ...
} catch(const char* p) {
    // handle character string exceptions here
}

当你抛出 viathrow "Error: Cannot divide by zero\n";时,后面的表达式throw是一个字符串文字,因此是n const char类型的数组(其中n是字符串的长度 + 1)。该数组类型衰减为指针 [except.throw]/3,因此抛出的对象类型为char const*.

[except.handle]/3 中描述了处理程序( ) 捕获的类型catch,这里没有任何情况适用,即const char*没有被类型的处理程序char*捕获。

于 2013-07-13T19:35:05.157 回答