9

我有一个 C++ 类,我正在尝试在 Ubuntu 中运行它:

#ifndef WRONGPARAMETEREXCEPTION_H_
#define WRONGPARAMETEREXCEPTION_H_

#include <iostream>
#include <exception>
#include <string>

using namespace std;

#pragma once

class WrongParameterException: public exception
{
    public:
        WrongParameterException(char* message): exception(message) {};
        virtual ~WrongParameterException() throw() {};
}; 

#endif

当我尝试编译它时,编译器给了我这个错误:

WrongParameterException.h: In constructor ‘WrongParameterException::WrongParameterException(char*)’:
WrongParameterException.h:14: error: no matching function for call to ‘std::exception::exception(char*&)’
/usr/include/c++/4.3/exception:59: note: candidates are: std::exception::exception()
/usr/include/c++/4.3/exception:57: note: std::exception::exception(const std::exception&)

谁能告诉我我做错了什么?我尝试将消息变量更改为stringconst stringconst string&但没有帮助。

以下是我如何使用从 main 创建的新异常:

try
{
     if ((strToInt1 == -1) || (parameters[1] == NULL) || (strToInt3 == -1) || (parameters[3] != NULL))
     {
          throw WrongParameterException("Error in the config or commands file");
     }
}
catch(WrongParameterException e)
{
     log.addMsg(e.what());
}
4

6 回答 6

19

首先,#pragma once是错误的做法,了解标头包含守卫。SO上的相关问题解释了为什么使用#pragma once是错误的方法。Wikipedia 解释了如何使用include 守卫,这些守卫具有相同的目的而没有任何缺点。

其次,您使用它不知道的参数调用 std::exception 的构造函数,在本例中是指向字符数组的指针。

#include <stdexcept>
#include <string>

class WrongParameterException : public std::runtime_error {
public:
    WrongParameterException(const std::string& message) 
        : std::runtime_error(message) { };
};

可能是你想要的。有关异常的更多信息,请查看有关异常的C++ FAQ Lite 文章和 cplusplus.com 上的异常文章

祝你好运!

于 2009-02-23T11:29:09.283 回答
9

std::exception 没有接受任何类型字符串的构造函数,只有一个返回异常描述的虚拟 what() 方法。

您必须自己存储字符串并从那里返回。

于 2009-02-23T11:14:49.690 回答
8

我的建议是:

  1. 继承自std::runtime_error。正如上面 X-Istence 所建议的那样。它在概念上是一个运行时错误,并且std::runtime_error构造函数也接受一个std::string作为参数来描述发生了什么。
  2. 关于您发现异常。我会使用catch(WrongParameterException const& e) (注意 const 引用)而不是catch(WrongParameterException e),因为首先,在您的情况下,异常通常是常量,而且,使用该引用,您可以捕获 的任何子类,WrongParameterException以防您的代码随着一些更精细的异常处理而演变。
于 2009-02-23T11:41:38.393 回答
5

std::exception 的构造函数不接受字符串参数。你试图给它一个,这就是导致编译错误的原因。

您需要存储您的字符串,最好将其作为 std::string 而不是原始指针处理,然后从what()方法中返回它。

于 2009-02-23T11:16:36.520 回答
2

查看MS VS2K5中异常类的声明,你想要的构造函数是:

exception (const char *const&);

所以尝试将您的构造函数更改为:

WrongParameterException (const char *const message)

看看是否有帮助。否则,将指针存储在您自己的类中并实现所有相关方法。

于 2009-02-23T11:17:13.023 回答
1

一个简单的解决方案是以不同的方式设计您的异常。这是一个简单的例子:

class MyException : public Exception
{
public:
   MyException(CString strError) { m_strError = strError; }

   CString m_strError;
};

然后,您可以随意使用您的异常消息。这是因为 Exception 没有除 String 之外的构造函数,因此您必须自己创建它。

于 2009-02-23T11:18:51.820 回答