2012-07-02 77 views
1

我需要我的方法拋出自定義異常 但它不斷給我這個錯誤:
error C2059: syntax error : 'string'C++自定義異常提示錯誤

我在讀下面的鏈接,但它並沒有解決我的問題:
http://msdn.microsoft.com/en-us/library/t8xe60cf%28VS.80%29.aspx

這是我的代碼:

#include <exception> 
#include <stdexcept> 
#include <string> 
#include "Log.h" 

LOG_USE() 

class Exception : public std::exception 
{ 
    public: 
     explicit Exception(std::string msg) 
      : message(msg) 
     {} 
     ~Exception() 
     {} 

     virtual const char* what() const throw() 
     { 
      LOG_MSG(message) // write to log file 
      return message.c_str(); 
     } 

    private: 
     std::string message; 
}; 

#endif 
在我的應用程序

某處我有看起來像這樣的方法:

..... 
.... 
void view::setDisplayView(ViewMode mode) throw(Exception("setDisplayView error")) 
{ 
    ; 
} 
.... 
.... 

我在做什麼錯在這裏?
我在32位Windows XP上使用Visual Studio 2008。

+0

定義你的LOG_MSG/LOG_USE? – RolandXu

+0

只是記錄,我可以將其刪除,並錯誤還是一樣的,當我發表意見擲(異常(「setDisplayView錯誤」)),每一件事情是工作 – user63898

+0

offtopic,但...您選擇登錄電子異常,只有當'什麼()'被調用,而不是每次拋出? – TeaOverflow

回答

4

你沒有正確使用異常規範。這throw,它遵循的setDisplayView的聲明,應該只包含一個類型(在你的情況,Exception),而不是對象(這是你與Exception("setDisplayView error"))。現在

,具有說,異常規範不贊成使用C++ 11,和以前沒有考慮的一個非常有用的功能。更好的是省略那個throw(Exception("setDisplayView error"))。只有在你不打算拋出任何東西時才使用異常規範。在這種情況下,使用的新語法是nothrow

編輯:

爲了表示異常已從setDisplayView拋出,當它的創建必須傳遞一個信息到異常 -

void view::setDisplayView(ViewMode mode) 
{ 
    if (badThingHappened()) 
      throw Exception("setDisplayView error"); 
} 

有各種非標準的技術來尋找原點捕捉它時的例外情況,你可以找到一些here。使用異常規範僅僅是不是其中之一......

+0

謝謝 現在如何仍然可以捕獲在C++ 11和標準C++或只是標準C++ vaild的異常? 例如,我怎麼能在我的異常類中知道異常來自setDisplayView方法? – user63898

+1

@ user63898,這不是Java ......你可以拋出任何你想要的異常,而不必在任何地方指定(當然你可能會以某種方式記錄它)。現在,知道你的異常來自一個特定的方法需要一些「手動工作」 - 或者使用拋出異常(「setDisplayView錯誤」)拋出異常,或者可能創建一些宏來傳遞一些內置的宏如\ \ _FILE \ _ \ _,\ _ \ _ LINE \ _ \ _或\ _ \ _ FUNCTION \ _ \ _(如果您的編譯器支持它)。但是,異常規範在這裏不會成功。 – eran

+0

但我拋出的異常(「setDisplayView錯誤」)和其不工作 Exception類我都渴望 – user63898