将 std::exception 中的消息从托管代码传递到非托管代码
Passing message in std::exception from managed code to unmanaged
我正在尝试从托管代码中抛出一个 std::exception,以便它被非托管代码捕获。我挣扎的地方是传递一个字符串(描述异常),以便可以使用 what() 方法检查(重新)捕获的异常 ...
#pragma managed
static std::string InvokeMethod() {
try {
//...
}
catch (Exception^ ex) {
std::string myExMsg = msclr::interop::marshal_as<std::string>(ex->ToString());
throw std::exception(myExMsg);
}
}
#pragma unmanaged
void Execute() {
try {
myMethod = InvokeMethod();
}
catch (std::exception ex) {
SetError(ex.what());
}
}
这不会编译 “没有构造函数实例”stdext:exceptipon::exception”匹配参数列表参数类型是 (std::string)” 但是如果我'hard code'一个字符串变成std::exception这样...
throw std::exception("An error has occurred");
... 然后该字符串被传递并由 ex.what() 返回。我也试过了...
throw std::runtime_error(myExMsg);
... 但是 ex.what() 只是 returns 以 '\x7F' 结尾的字符串(以防万一)。
在我看来 std::exception 需要其他类型。但是什么类型的? 'myExMsg' 需要什么才能使 ex.what() returns 相同的字符串(可以在 SetError 方法中使用)?
根据@Joe 的建议,我继承自 std::exception ...
class InvokeException : public std::exception {
public:
InvokeException(std::string const& message) : msg_(message) { }
virtual char const* what() const noexcept { return msg_.c_str(); }
private:
std::string msg_;
};
...然后...
const std::string myExMsg = msclr::interop::marshal_as<std::string>(ex->Message);
throw InvokeException(myExMsg);
我正在尝试从托管代码中抛出一个 std::exception,以便它被非托管代码捕获。我挣扎的地方是传递一个字符串(描述异常),以便可以使用 what() 方法检查(重新)捕获的异常 ...
#pragma managed
static std::string InvokeMethod() {
try {
//...
}
catch (Exception^ ex) {
std::string myExMsg = msclr::interop::marshal_as<std::string>(ex->ToString());
throw std::exception(myExMsg);
}
}
#pragma unmanaged
void Execute() {
try {
myMethod = InvokeMethod();
}
catch (std::exception ex) {
SetError(ex.what());
}
}
这不会编译 “没有构造函数实例”stdext:exceptipon::exception”匹配参数列表参数类型是 (std::string)” 但是如果我'hard code'一个字符串变成std::exception这样...
throw std::exception("An error has occurred");
... 然后该字符串被传递并由 ex.what() 返回。我也试过了...
throw std::runtime_error(myExMsg);
... 但是 ex.what() 只是 returns 以 '\x7F' 结尾的字符串(以防万一)。
在我看来 std::exception 需要其他类型。但是什么类型的? 'myExMsg' 需要什么才能使 ex.what() returns 相同的字符串(可以在 SetError 方法中使用)?
根据@Joe 的建议,我继承自 std::exception ...
class InvokeException : public std::exception {
public:
InvokeException(std::string const& message) : msg_(message) { }
virtual char const* what() const noexcept { return msg_.c_str(); }
private:
std::string msg_;
};
...然后...
const std::string myExMsg = msclr::interop::marshal_as<std::string>(ex->Message);
throw InvokeException(myExMsg);