抛出运行时错误

时间:2014-10-03 00:27:19

标签: c++ error-handling

我是编程新手,我开始使用C ++编程:原理和实践。在其中一章中,它讨论了错误以及如何处理它们。

这里的代码片段是我正在尝试实现的。在书中,它声明error()将使用系统错误消息加上我们作为参数传递的字符串来终止程序。

#include <iostream>
#include <string>

using namespace std;

int area (int length, int width)
{
    return length * width;
}

int framed_area (int x, int y)
{
    return area(x-2, y-2);
}

inline void error(const string& s)
{
    throw runtime_error(s);
}


int main()
{
    int x = -1;
    int y = 2;
    int z = 4;

    if(x<=0) error("non-positive x");
    if(y<=0) error("non-positive y");

    int area1 = area(x,y);
    int area2 = framed_area(1,z);
    int area3 = framed_area(y,z);

    double ratio = double(area1)/area3;

    system("PAUSE");
    return EXIT_SUCCESS;
}

我得到的消息是“测试project.exe中的0x7699c41f处的未处理异常:Microsoft C ++异常:内存位置为0x0038fc18的std :: runtime_error ..”

所以我的问题是,我传递给error()的消息没有传递给我做错了什么?

2 个答案:

答案 0 :(得分:3)

正如我在评论中提到的,你必须“抓住”你“抛出”的错误,以免你的程序立即终止。您可以使用try-catch块“捕获”抛出的异常,如下所示:

#include <iostream>
#include <string>

using namespace std;

int area (int length, int width)
{
    return length * width;
}

int framed_area (int x, int y)
{
    return area(x-2, y-2);
}

inline void error(const string& s)
{
    throw runtime_error(s);
}


int main()
{
    int x = -1;
    int y = 2;
    int z = 4;

    try
    {
        if(x<=0) error("non-positive x");
        if(y<=0) error("non-positive y");

        int area1 = area(x,y);
        int area2 = framed_area(1,z);
        int area3 = framed_area(y,z);

        double ratio = double(area1)/area3;
     }
     catch (runtime_error e)
     {
         cout << "Runtime error: " << e.what();
     }

    system("PAUSE");
    return EXIT_SUCCESS;
}

答案 1 :(得分:1)

首先,我不知道您的程序是如何编译的,您需要包含stdexcept

要回答,您的计划正在按照应有的方式行事。您可能在阅读中遗漏了一些内容,但不幸的是您从Microsoft获得的错误消息。这是我在OSX上得到的输出:

terminate called after throwing an instance of 'std::runtime_error'
  what():  non-positive x
Abort trap: 6

OSX给了我what()的内容,所以至少我知道我的例外是终止了该程序。

我假设你使用的是Visual Studio,而我真的不知道如何使用它。也许如果你在调试模式下编译程序,它将提供更多的输出,以确定抛出异常的实际情况。

无论如何,这可能不是您希望程序结束的方式,您应该将可能引发异常的代码放在try块中,然后catch

 int main()
{
    try
    {
      int x = -1;
      int y = 2;
      int z = 4;

      if(x<=0) error("non-positive x");
      if(y<=0) error("non-positive y");

      int area1 = area(x,y);
      int area2 = framed_area(1,z);
      int area3 = framed_area(y,z);

      double ratio = double(area1)/area3;
    }
    catch( const std::runtime_error& error )
    {
      std::cout << error.what() << '\n';
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}