2012-07-31 45 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__);