首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串异常-抛出c- C++作为异常是不好的吗?

字符串异常-抛出c- C++作为异常是不好的吗?
EN

Stack Overflow用户
提问于 2011-06-06 14:18:50
回答 7查看 16.9K关注 0票数 36

我正在开发一个小的c++程序并学习异常。下面的代码是“坏的”吗?如果是的话,我能做些什么来改进它呢?

代码语言:javascript
运行
复制
try {
    // code
    if (some error) {
        throw "Description of error.";
    }
}
catch (char* errorMessage) {
    cerr << errorMessage << endl << "Fatal error";
}

char数组作为异常抛出有什么问题吗?

编辑:这是一种更好的方式吗?

代码语言:javascript
运行
复制
const char errorMessage[] = "Description of error";

try {
    // code
    if (some error) {
        throw errorMessage;
    }
}
catch (char* errorMessage) {
   cerr << errorMessage << endl << "Fatal error";
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-06-06 14:24:55

抛出一个标准的异常对象要好得多。通常,最佳实践是抛出从std::exception派生的东西,以便在某些情况下确实导致程序终止时,实现有更好的机会打印有用的诊断信息。

因为这样做并不难,所以我永远不会推荐抛出一个原始的字符串文字。

代码语言:javascript
运行
复制
#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;
    }
}
票数 52
EN

Stack Overflow用户

发布于 2011-06-06 16:22:46

抛出字符串文字通常不是一个好主意,因为随着代码的发展,程序员可能需要用一些更多的信息来丰富错误消息,例如变量的值,或者抛出异常的行号。

给定捕获const char*的未知客户端代码,鼓励程序员使用更动态的机制来连接所需的信息:

  • std::string和字符缓冲区,也可能是strcat和/或

使用这些方法的最明显的方法不起作用或者不起作用:

代码语言:javascript
运行
复制
// 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描述的类对于编写可维护的代码非常重要。

票数 10
EN

Stack Overflow用户

发布于 2011-06-06 14:21:34

不,抛出一个char数组是有问题的。只是你应该收到的,

代码语言:javascript
运行
复制
catch(const char* const errorMessage) {...}

第一个const是添加接收任何char char* const char* char[] const char[]的功能

第二个const用于指定errorMessage不打算在catch数据块内更改

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6248404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档