【问题标题】:c++ custom exception added to method gives errorc++自定义异常添加到方法给出错误
【发布时间】:2012-07-02 13:32:06
【问题描述】:

我需要我的方法来抛出自定义异常 但它一直给我这个错误:
error C2059: syntax error : 'string'

我正在阅读以下链接,但它没有解决我的问题:
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。

【问题讨论】:

  • 你的 LOG_MSG/LOG_USE 是什么定义的?
  • 只是日志,我可以删除它并且错误仍然相同,当我评论 throw(Exception("setDisplayView error")) 一切正常
  • 离题了,但是...您只在调用 what() 而不是每次抛出它时才记录异常?

标签: c++ exception inheritance


【解决方案1】:

您没有正确使用异常规范。在setDisplayView 声明之后的throw 应该只包含一个类型(在您的情况下为Exception),而不是一个对象(这是您使用Exception("setDisplayView error") 得到的)。

现在,话虽如此,异常规范在 C++11 中已被弃用,并且之前未被认为是有用的特性。最好省略throw(Exception("setDisplayView error"))。仅当您不打算抛出任何东西时才使用异常规范。在这种情况下,要使用的新语法是nothrow

编辑:

要表示异常已从 setDisplayView 引发,您必须在创建异常时将该信息传递给异常 -

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

有各种非标准的技术可以在捕获异常时找到它的来源,你可以找到一些here。使用异常规范不是其中之一......

【讨论】:

  • 谢谢,现在如何才能捕获在 c++11 和标准 c++ 或标准 c++ 中有效的异常?例如,我如何在我的异常类中知道异常来自 setDisplayView 方法?
  • @user63898,这不是 Java ......你可以抛出你想要的任何异常,而不必在任何地方指定(当然,你可能会以某种方式记录它)。现在,知道你的异常来自某个方法需要一些“手动工作”——要么使用throw Exception("setDisplayView error") 抛出异常,要么创建一些宏来传递一些内置宏,如 __FILE__、__LINE__ 或 __FUNCTION__(如果你的编译器支持它)。但是异常规范在这里不起作用。
  • 但我确实抛出异常(“setDisplayView 错误”)并且它在异常类中不起作用我有所有的渴望
  • 我正在谈论使用throw Exception("setDisplayView error") inside view::setDisplayView,在您发现错误并希望将其报告给调用者的确切位置。只需删除view::setDisplayView(ViewMode mode){ 之间的内容即可。
  • 你的意思是 try{ throw ... 函数内部的东西。这是唯一的原因吗?
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 2019-05-20
  • 2020-07-06
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多