try-catch使用模板类中定义的异常

时间:2011-12-03 21:22:57

标签: c++ templates try-catch nested-class

我正在尝试使用链接列表实现优先级队列,但我遇到了try / catch问题。以下是优先级队列头文件的相关部分:

#ifndef PRIORITYQUEUELINKED_H
#define PRIORITYQUEUELINKED_H

    #include "RuntimeException.h"
    #include <list>

    using namespace std;

    template <typename E, typename C>        // uses data type and some total order relation
    class PriorityQueueLinked {

    // code for PriorityQueueLinked

            class EmptyPriorityQueueException : public RuntimeException {
                public:
                    EmptyPriorityQueueException() : 
                                    RuntimeException("Empty priority queue") {}
            };

    // more code

    #endif

这是RuntimeException头文件:

#ifndef RUNTIMEEXCEPTION_H_
#define RUNTIMEEXCEPTION_H_

#include <string>

class RuntimeException {// generic run-time exception
private:
    std::string errorMsg;
public:
   RuntimeException(const std::string& err) { errorMsg = err; }
   std::string getMessage() const { return errorMsg; }
};

inline std::ostream& operator<<(std::ostream& out, const RuntimeException& e)
{
   out << e.getMessage();
   return out;
}

#endif

这是我的主要内容:

#include "PriorityQueueLinked.h"
#include "Comparator.h"
#include <iostream>

using namespace std;

int main() {
    try {
        PriorityQueueLinked<int,isLess> prique; // empty priority queue
        prique.removeMin();                    // throw EmptyPriorityQueueException
    }
    catch(...) {
        cout << "error" << endl << endl;
    }
    getchar();
    return 0;
}

我的问题在于无法为catch获取“...”的替换。我尝试过几个方面,其中之一:“catch(PriorityQueueLinked&lt; int,isLess&gt; :: EmptyPriorityQueueException E)”,但在这种情况下,它表示EmptyPriorityQueueException不是PriorityQueueLinked的成员。任何建议将不胜感激。 感谢

1 个答案:

答案 0 :(得分:1)

Try-catch支持使用异常类继承。 catch (const RuntimeException & ex)将捕获RuntimeException的任何子类,即使它是私有的。这是导出异常类的重点。

顺便说一下,永远不要写using namespace std;是一个标题,你永远不知道是谁包含它,以及如何。此外,标准库已经拥有了您的真实目的异常类,这真是一个惊喜!他们还会将运行时异常,例外情况写成:std::runtime_exception。您可以在<stdexcept>找到它。