我正在开发一个小的c++程序并学习异常。下面的代码是“坏的”吗?如果是的话,我能做些什么来改进它呢?
try {
// code
if (some error) {
throw "Description of error.";
}
}
catch (char* errorMessage) {
cerr << errorMessage << endl << "Fatal error";
}将char数组作为异常抛出有什么问题吗?
编辑:这是一种更好的方式吗?
const char errorMessage[] = "Description of error";
try {
// code
if (some error) {
throw errorMessage;
}
}
catch (char* errorMessage) {
cerr << errorMessage << endl << "Fatal error";
}发布于 2011-06-06 14:24:55
抛出一个标准的异常对象要好得多。通常,最佳实践是抛出从std::exception派生的东西,以便在某些情况下确实导致程序终止时,实现有更好的机会打印有用的诊断信息。
因为这样做并不难,所以我永远不会推荐抛出一个原始的字符串文字。
#include <stdexcept>
void someFunction()
{
try {
// code
if (some error) {
throw std::runtime_error( "Description of error." );
}
}
catch (const std::exception& ex) {
std::cerr << ex.what() << "\nFatal error" << std::endl;
}
}发布于 2011-06-06 16:22:46
抛出字符串文字通常不是一个好主意,因为随着代码的发展,程序员可能需要用一些更多的信息来丰富错误消息,例如变量的值,或者抛出异常的行号。
给定捕获const char*的未知客户端代码,鼓励程序员使用更动态的机制来连接所需的信息:
std::string和字符缓冲区,也可能是strcat和/或使用这些方法的最明显的方法不起作用或者不起作用:
// temporaries...
throw (std::string("couldn't parse input: ") + input).c_str();
throw (std::ostringstream() << "error line " << __LINE__).str().c_str();
char buf[1024]; sprintf(buf, "error line %ld%", __LINE); throw buf;
// not thread-safe
static char buf...即使程序员知道不要这样做,他们仍然有机会找到需要开始接受更丰富的值类型的所有客户端代码,特别是如果const char*的其他throw/catch用法持续存在的话。
因此,使用一个通过值嵌入灵活的std::string描述的类对于编写可维护的代码非常重要。
发布于 2011-06-06 14:21:34
不,抛出一个char数组是有问题的。只是你应该收到的,
catch(const char* const errorMessage) {...}第一个const是添加接收任何char char* const char* char[] const char[]的功能
第二个const用于指定errorMessage不打算在catch数据块内更改
https://stackoverflow.com/questions/6248404
复制相似问题