2012-07-02 80 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