gpt4 book ai didi

c++ - 带有 char* 构造函数的异常类

转载 作者:IT老高 更新时间:2023-10-28 21:35:40 28 4
gpt4 key购买 nike

我在VS2008上遇到了如下代码

if (!CreateProcess( NULL,
const_cast<LPWSTR>(ss.str().c_str()),
NULL,
NULL,
FALSE,
CREATE_NO_WINDOW|NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi))
{
throw std::exception("Unable to format Device");
}

现在我将代码移植到 mingw gcc 并收到错误

error: no matching function for call to 'std::exception::exception(const char [23])'

调查该问题时,我注意到 Visual Studio 有一个文件异常,它确实有一个异常类并且确实接受了 char*。有些定义是这样的

   __CLR_OR_THIS_CALL exception();
__CLR_OR_THIS_CALL exception(const char *const&);
__CLR_OR_THIS_CALL exception(const char *const&, int);
__CLR_OR_THIS_CALL exception(const exception&);
exception& __CLR_OR_THIS_CALL operator=(const exception&);
virtual __CLR_OR_THIS_CALL ~exception();
virtual const char * __CLR_OR_THIS_CALL what() const;

我的问题是我应该如何在 mingw gcc 上规避这个构建问题?我应该创建一个继承自 std::runtime_error 的新类并抛出它吗?

最佳答案

意见在这里发挥作用。问题是 std::exception 没有接受字符串参数的构造函数;这是一个 MSVC 扩展。我看到了两种解决方法:

  1. 不要传递字符串参数
  2. 不要使用 std::exception

第一种情况很简单;只需使用

throw std::exception();

缺点是您不会收到描述性错误消息。

如果错误信息很重要,则不能直接使用 std::exception。在这种情况下,您可以使用 std::logic_errorstd::runtime_error,它们继承 std::exception 并且构造函数采用一个字符串参数,所以

throw std::runtime_error("Unable to format Device");

可能已经解决了问题。捕获 std::exceptioncatch 子句也将捕获 std::runtime_error。但是有一个潜在的问题:捕获 std::runtime_errorcatch 子句不会捕获 std::exception 但会捕获这个一个。

这似乎有点极端,完全有可能对您来说不是问题。但是,如果调用堆栈中可能有一个 catch 子句捕获 std::runtime_error 但不应捕获此代码引发的异常,则您可以从带有字符串参数的 std::exception 派生出您自己的异常类。因为这个类是新的,它不会被现有的 catch 子句捕获。例如:

class descriptive_exception : public std::exception {
public:
descriptive_exception(std::string const &message) : msg_(message) { }
virtual char const *what() const noexcept { return msg_.c_str(); }

private:
std::string msg_;
}

然后

throw descriptive_exception("Unable to format Device");

这可以说不是很漂亮,也不太可能是必要的,所以更可能的解决方案是使用 std::runtime_errorstd::logic_error (或从其中一个派生的类)。

std::logic_error 还是 std::runtime_error 哪个更合适不是很明确;在这种情况下,我可能会选择 std::runtime_error,因为该错误在理论上似乎无法预测,但鉴于 std::domain_errorstd: :future_error 派生自 std::logic_error,它在该层次结构中不会完全不合适。我认为这是一个见仁见智的问题。

关于c++ - 带有 char* 构造函数的异常类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28640553/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com