我有一个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&)
谁能告诉我我做错了什么?我尝试将消息变量更改为string
或const string
或const 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());
}
答案 0 :(得分:18)
首先,#pragma once
是错误的方法,了解标题包括警卫。 Related question on SO解释了为什么使用#pragma once
是错误的方法。维基百科解释了如何使用include guards来实现相同目的而没有任何缺点。
其次,您使用它不知道的参数调用std :: exception的构造函数,在本例中是指向字符数组的指针。
#include <stdexcept>
#include <string>
class WrongParameterException : public std::runtime_error {
public:
WrongParameterException(const std::string& message)
: std::runtime_error(message) { };
};
可能是你想要的。有关例外的更多信息,请访问cplusplus.com上的C++ FAQ Lite article on Exceptions和exceptions article。
祝你好运!答案 1 :(得分:9)
std :: exception没有一个构造函数,它接受任何类型的字符串,只有一个返回异常描述的虚拟what()方法。
您必须自己存储字符串并从那里返回。
答案 2 :(得分:8)
我的建议是:
std::runtime_error
。正如上面的X-Istence所建议的那样。它在概念上是一个运行时错误,std::runtime_error
构造函数也接受std::string
作为描述发生事件的参数。catch(WrongParameterException const& e)
(注意const引用)而不是catch(WrongParameterException e)
,因为首先,异常在你的情况下通常是常量,并且,使用引用,你捕获{{的任何子类1}}以防你的代码通过更精细的异常处理进行演变。答案 3 :(得分:5)
std :: exception的构造函数不接受字符串参数。你试图给它一个,这是导致编译错误的原因。
您需要存储字符串,最好将其作为std :: string而不是原始指针处理,并从what()
方法返回。
答案 4 :(得分:2)
查看MS VS2K5中异常类的声明,您想要的构造函数是:
exception (const char *const&);
所以尝试将构造函数更改为:
WrongParameterException (const char *const message)
看看是否有帮助。否则,将指针存储在您自己的类中并实现所有相关方法。
答案 5 :(得分:1)
一个简单的解决方案是不同地设计您的异常。这是一个简单的例子:
class MyException : public Exception
{
public:
MyException(CString strError) { m_strError = strError; }
CString m_strError;
};
然后您可以根据需要简单地使用您的异常消息。这是因为Exception没有一个排除String的构造函数,所以你必须自己创建它。