#include <exception>
#include <iostream>
#include <cstdio>
using namespace std;
class BaseException : exception {
public:
BaseException(const char* message) : message(message) {}
const char* getMessage() {
return message;
}
private:
const char* message;
};
void wrong() {
unsigned short int argumentCallCounter = 1;
/// @todo check why commented below does not work ?!
// char tmp[13 + sizeof(argumentCallCounter)];
/// @todo but this works
char* tmp = new char[13 + sizeof(argumentCallCounter)];
sprintf(tmp, "No %u argument", argumentCallCounter);
throw BaseException(tmp);
}
int main(int argc, char** argv) {
try {
wrong();
} catch (BaseException e) {
cout << e.getMessage() << endl;
}
return 0;
}
上面的代码有效,但在评论中,有一段代码段无效
char tmp[13 + sizeof(argumentCallCounter)];
我知道它不起作用,因为当程序离开函数wrong
时,变量tmp不再存在
任何人都可以帮忙吗?
还有我写的决定:
char* tmp = new char[13 + sizeof(argumentCallCounter)];
这也不好,因为当程序完成时,会有内存泄漏,因为没有人删除tmp
答案 0 :(得分:4)
我经常抛出一个用std :: string初始化的std :: runtime_exception。
答案 1 :(得分:3)
http://www.cplusplus.com/reference/iostream/stringstream/ http://www.cplusplus.com/reference/std/stdexcept/runtime_error/
void wrong() {
unsigned short int argumentCallCounter = 1;
std::stringstream ss;
ss << "No " << argumentCallCounter << " argument";
throw std::runtime_error(ss.str());
}
答案 2 :(得分:2)
//why commented below is not works
char tmp[13 + sizeof(argumentCallCounter)];
它不起作用,因为tmp
是函数的本地函数,并且在退出函数后它不再存在,但您仍然尝试从main()
访问它。
我建议您在std::string
和其他任何地方使用BaseException
。
我还建议您通过const
引用来捕获异常:
catch (const BaseException & e)
// ^^^^^ note ^ note
编辑:
按如下方式实施BaseException
:
class BaseException : std::exception
{
public:
BaseException(std::string msg) : message(msg) {}
//override std::exception::what() virtual function
virtual const char* what() const throw()
{
return message.c_str();
}
private:
std::string message;
};
将其用作:
try
{
//some code that might throw BaseException
}
catch (const BaseException & e)
{
cout << "exception message : " << e.what() << endl;
}
编辑:
将wrong()
实施为
void wrong() {
unsigned short int argumentCallCounter = 1;
std::stringstream ss;
ss << "No " << argumentCallCounter << " argument";
throw BaseException(tmp.str());
}
答案 3 :(得分:0)
“不行”是什么意思?
BaseException
应该复制从构造函数中获取的字符串,并为其创建本地副本。然后,wrong
函数可以在任何情况下解除分配。
当你这样做时,本地tmp
数组应该再次工作。