2012-07-31 48 views
2

我想做一些异常处理。我打算使用__LINE____FILE__宏。已禁用__LINE__宏?

我有一些标题Vectors.hpp,其中我实现了一些向量结构的类。在这个类中,我实现了operator [],并且我希望每次使用此运算符时都会抛出异常并带出一个超出边界的索引。我在一些源码test.cpp中测试这个类。然后,我希望能够看到test.cpp中发生这种情况的确切行。

但是我知道__LINE__宏在每次包含头文件时都被禁用,所以我得到的是Vector.hpp中处理异常的行,而不是test.cpp中的行。有没有一种很好的方法来解决这个问题?或者,如何实现他自己的__LINE__宏?

+0

也许这个是类似于你的问题 http://stackoverflow.com/questions/3026649/getting-information-about-where-c-exceptions-are-thrown-inside-of-catch-block – 2012-07-31 15:48:02

回答

5

__LINE__宏从不禁用。它在你写它的地方扩大了。有写代码两种方式(更确切地说,有两种方法可以产生令牌):

  • 写这手动
  • 使用预处理程序编写代码

如果你有它的一些文件foo.cpp像这样(只是一个例子,这是非常糟糕的代码实际上)

class Foo { 
public: 
    Frob operator[] (size_t) { throw __LINE__ } 
}; 

然后__LINE__始终是3和__FILE__总是foo.cpp

这是因为这些宏在使用它们的地方展开。解决办法是找到一种方法,让他们扩大在那里你想它,这样做的唯一方法是定义另一个宏:

#define safe_subscript(foo, index) \ 
     try {foo[index];} \ 
     catch(...) { std::cout << __LINE__ << '\n'; } 

.... 
safe_subscript(foo, 256); 

但正如你看到的,这导致了相当丑陋的代码和解决方法。

真正的解决办法:只要在出界(throw std::out_of_range)抛出一个异常,或做这样the standard library

T& operator[] (size_type i) { return store_[i]; } 
T& at (size_type i) { if (i>size_) throw std::out_of_range("crap"); 
         return store_[i]; } 

T operator[] (size_type i) const { return store_[i]; } 
T at (size_type i) const { if (i>size_) throw std::out_of_range("crap"); 
          return store_[i]; } 

如果您的用户将收到一个异常,他应该调试那些他/她/它发生编程错误。

1

您可以传递当前行作为异常的一部分。定义你的例外,因为

struct MyException : public std::exception { 
    MyException(const char* line) : errorLine(line); 
    const char* errorLine; 
}; 

而且使用它,如下所示:

if (isError()) 
    throw MyException(__LINE__);