C++ 试接投掷中的异常终止

C++ 试接投掷中的异常终止,c++,exception,try-catch,throw,C++,Exception,Try Catch,Throw,我的操作系统是Win8 使用代码::Blocks 12.10 我正在尝试使用来自的一个示例来处理抛出和处理异常 从C++早期对象出发,Addison Wesley .< 下面是我正在使用的简单代码: // This program illustrates exception handling #include <iostream> #include <cstdlib> using namespace std; // Function prototype double

我的操作系统是Win8
使用代码::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;
 }
我已经看过其他的例子,但还没有找到类似的代码来推导答案


<建议>?/P> < P> C++中有一个令人信服的例子,[除了.Pox] / 1:< /P> 例如:

throw "Help!";
可以由
const char*
类型的处理程序捕获:

try {
    // ...
} catch(const char* p) {
    // handle character string exceptions here
}
当您通过
throw“Error:Cannot divide by zero”抛出时\n
throw
之后的表达式是字符串文字,因此其类型为数组nconstchar(其中n是字符串的长度+1)。此数组类型衰减为指针[except.throw]/3,因此抛出的对象类型为
char const*


由句柄捕获的类型(<代码> catch <代码>)在[Real.Real]/3中描述,并且没有一种情况适用于这里,即<代码> conchch**/COD>不被类型<代码> char *<代码>的处理程序捕获。

< P>在C++标准中有一个令人信服的例子,(除了抛出)/ 1:< /P> 例如:

throw "Help!";
可以由
const char*
类型的处理程序捕获:

try {
    // ...
} catch(const char* p) {
    // handle character string exceptions here
}
当您通过
throw“Error:Cannot divide by zero”抛出时\n
throw
之后的表达式是字符串文字,因此其类型为数组nconstchar(其中n是字符串的长度+1)。此数组类型衰减为指针[except.throw]/3,因此抛出的对象类型为
char const*



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

类型的处理程序捕获。您是否尝试捕获
char const*
?(只是一个猜测)“以下消息”是什么?我建议声明最接近首次使用的变量,并在可能的情况下将其初始化为其值。该程序在VC11中运行良好。我将异常消息作为输出。@jrok-在C++11之前,有一个字符串文本类型的隐式转换为
char*
,因此对于C++11之前的编译器,代码是有效的。您是否尝试捕获
char const*
?(只是一个猜测)“以下消息”是什么?我建议声明最接近首次使用的变量,并在可能的情况下将其初始化为其值。该程序在VC11中运行良好。我将异常消息作为输出。@jrok-在C++11之前,字符串文字的类型被隐式转换为
char*
,因此对于C++11之前的编译器,代码是有效的。这对于C++11是正确的;在C++11之前,有一个从字符串文字到
char*
的隐式类型转换,代码是有效的。是的,它被弃用了,但这并不意味着它不是语言的一部分。弃用意味着它可能在将来消失。使用C样式的头是不受欢迎的,但它们永远不会消失,尽管在标准化的早期,有些人有幻想。是的,我不是说它被禁止。应该已经避免使用它了,即使在C++03中它仍然是合法的;在进一步研究C++03标准后,如果没有
const
@PeteBecker,我永远不会写catch子句。从数组到n const char到指针到char的转换是合法的,而不是指针转换吗?这对于C++11是正确的;在C++11之前,有一个从字符串文字到
char*
的隐式类型转换,代码是有效的。是的,它被弃用了,但这并不意味着它不是语言的一部分。弃用意味着它可能在将来消失。使用C样式的头是不受欢迎的,但它们永远不会消失,尽管在标准化的早期,有些人有幻想。是的,我不是说它被禁止。应该已经避免使用它了,即使在C++03中它仍然是合法的;在进一步研究C++03标准后,如果没有
const
@PeteBecker,我永远不会编写catch子句。从数组到n const char到指针到char的转换是合法的,而不是指针转换吗?