使用try catch和exception throws的方法

时间:2012-10-23 22:01:26

标签: c++ loops types try-catch

所以我有以下方法:

template <class DT> //needs testing
DT& LinkedSortedArrays<DT>::find (const DT& key)
{
    list<SortedArray<DT>>::iterator it = SAList.begin();
    for( ; it != SAList.end(); ++it){
        try{
            if (it == SAList.begin() && key < (*it)[0]) throw Exception();
            return (*it).find(const_cast<DT&> (key));
        } catch (ArrayException e) {

        }
    }
    throw Exception();
}

我之前已定义过课程ExceptionArrayException。每次在正在搜索的特定Array类中找不到(*it).find(const_cast<DT&> (key))时,key将抛出一个ArrayException。 SAListSTL List。代码编译得很好。但是我没有在我的程序中尝试过。为什么?我需要有人在我做的以下假设中确认或纠正我:

  1. 每当if (it == SAList.begin() && key < (*it)[0]) throw Exception();抛出异常时,就意味着它会将它抛出for循环,甚至在方法之外,对吗?
  2. 我几乎可以确定最后一行throw Exception();会在方法之外抛出异常。
  3. for循环的排列方式,它不会跳过SAList的第一个元素,对吧?我的意思是,我已经在互联网上看到了这个特定的代码,用于遍历列表中的所有元素,就好像它是标准的或完美的,但...... ++it扭曲了我的大脑。帮助
  4. 我收到错误can't convert const int to int&(因为find()中的(*it).find(const_cast<DT&> (key))不属于LinkedSortedArrays,而是需要DT&amp;变量的另一个LinkedSortedArrays并且find()的{​​{1}}具有const DT&amp;类型的参数,我发现可能的解决方案可能是将其写为const_cast<DT&> (key)。我需要就此发表第二意见。
  5. 最后,我理解这是不是一个特定的问题,因此我得到了投票和/或问题被关闭。我根本不知道还有什么要问的。 如果我是在错误的地方询问的话。道歉。

1 个答案:

答案 0 :(得分:2)

  1. 是的,它会上升到堆栈,直到找到合适的catch处理程序。如果找不到这样的处理程序,程序将终止。

  2. 是的。

  3. 不,它不会,因为end应该将迭代器返回到结尾的一个,而不是最后一个元素。除非该容器的设计也很糟糕,否则您必须查阅文档以确定。

  4. 这是一个糟糕的设计,find应该通过const引用来获取其参数。既然你做不到,你将不得不制作副本,除非你想冒未定义的行为风险:

    DT nonconstkey = key;
    return it->find(nonconstkey);