English 中文(简体)
C+++ 处理意外错误
原标题:C++ handling unanticipated errors

我需要学习一个研究项目的 C++ 基础, 而我正在实验错误/ 例外处理 。 我确实成功地使用了 < code>throw 命令来预测可能发生的事件( 如除以零), 但我无法找到如何捕捉意外例外 。 请使用此示例代码 :

#include <iostream>
#include <exception>
#include <stdexcept>
using namespace std;

void arrayOutOfBound()
{
    int a[3] = {1, 2, 3};

    try
    {
        cout << "This should not display: " << a[5] << endl;
    }
    catch(runtime_error &e)
    /* catch(exception &e)     // also does not work  */
    {
        cout << "Error: " << e.what() << endl;
    }
}

int main()
{
    arrayOutOfBound();
}

我猜我一定得在某个地方使用 throw 语句, 但我真的不知道 a[5] 会不会有效(或者用户输入了这个索引,而我没有检查数组大小), 那么我怎么能防止程序崩溃呢? (这种情况在视觉 C++ Express 2010调试器中发生)

注意: 如果我在区块外先做 try {int 结果 { int 结果 = a[5]; /code>, 并尝试在结尾处使用 cout & lt; & lt; 结果 , 程序不会编译。 编译者试图帮助我, 但我不能尝试例外处理 。

最佳回答

假设我真的不知道一个 [5] 会工作(或者用户输入了这个索引,我没有检查数组大小), 那么我怎么能防止程序崩溃呢?

简单来说,您不能。如果无法进入一个数组导致 C++ 中未定义的行为, 它不会破例。 如果您幸运的话, 就会发生崩溃 。

问题回答

抱歉无法拒绝引用一个显而易见的meme“本地阵列... 不是你如何做到的!” D:

您在上面写入的代码使用了本质上是一个内存位置的本地数组。 因此, 您说 [ 5], 您说我想在地址( a + 4 * 大小( int) ) 上使用 4 字节来被解读为 int。 这不会丢出一个例外 。 这是未定义的行为, 可能会返回垃圾 。 如果您使用 - O2 或某些这样的编译符旗, 它可能返回 0 和 btw, 这是缓冲溢出源 : D 。

在此设置一个模板类, 以解决您的问题 :

#include <iostream>
#include <exception>
#include <stdexcept>
#include <vector>
using namespace std;

template<class T, size_t COUNT>
class CheckedArray
{
public:
    class OutOfBounds : public std::exception
    {
        public:
            virtual const char* what() const throw(){ return "Index is out of bounds"; }    
    };
    CheckedArray(){}
    virtual ~CheckedArray(){}
    const T& operator[] (size_t index) const
    {
        if(index >= COUNT){ throw OutOfBounds(); }
        return m_array[index];
    }
    T& operator[] (size_t index)    
    {
        if(index >= COUNT){ throw OutOfBounds(); }
        return m_array[index];
    }
private:
    T m_array[COUNT];
};
void arrayOutOfBound()
{
    //int a[3] = {1, 2, 3};

    CheckedArray<int,3> a;
    a[0] = 1;
    a[1] = 2;
    a[2] = 3;
    try
    {
        cout << "This should not display: " << a[5] << endl;
    }
    catch(std::exception& e)     // this will kick in
    {
        cout << "Error: " << e.what() << endl;
    }
}


int main()
{
    arrayOutOfBound();
}

如果您想要这样的行为, 建议您写入一个类, 比如“ 检查的阵列”, 该类可以覆盖阵列并进行边框检查 。 如果您在完全通用的情况下这样做, 它将是一个模板类, 当然您需要了解超载操作员的情况 。

或者,如果您对动态分配数组的间接载荷感到满意,请使用 std::Victor ,特别是其 at 成员函数,对远距指数进行例外处理。作为附带利益,您的数组现在可以在运行时(重新)缩放。

更好的是,使用 < code>std::array ,其中还有 < code> at 函数(但无法重新配置 。 )

如果您使用 std:: array , 而不是 C 样式数组, 以及 .at () 成员函数, 您本可以捕捉到数组约束错误 。

std::array <int, 5> stdArray = {1, 2, 3, 4, 5};

//array boundary check

 try  {
        cout << "trying to access out of bound element " << endl;
        cout << stdArray.at(5) << endl;
 } catch(std::exception &e) {
        cout << "Error: " << e.what() << endl;
  }

Now the program does not crash, instead, you see this output Error: array::at: __n (which is 5) >= _Nm (which is 5)

如果您只是想要一个处理分割断层断层的处理器, 您应该检查信号 。 h

/ 约翰





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签