【发布时间】:2011-10-14 13:44:32
【问题描述】:
我正在一个大型非托管 C++ 库和一个大型 C# 库上开发一个瘦托管 C++ 包装器。我需要捕获源自该大型非托管 C++ 库的错误,并将它们作为 Clr 异常重新抛出。非托管库抛出以下类的实例:
Error::Error(const std::string& file, long line,
const std::string& function,
const std::string& message) {
message_ = boost::shared_ptr<std::string>(new std::string(
format(file, line, function, message)));
}
const char* Error::what() const throw () {
return message_->c_str();
}
到目前为止,我想出了这个:
try{
// invoke some unmanaged code
}
catch(Object*)
{
throw gcnew System::Exception("something bad happened");
}
如何从 Error 类中提取消息并将其转换为 Clr String 类,以便将其传递给 gcnew System::Exception() 构造函数? 如果非托管代码抛出其他东西,我的 catch 块会捕获它吗?
编辑:我正在使用 catch(Object*) 因为那是 recommended in MCDN
【问题讨论】:
-
如果
Error的实例被抛出,你为什么要捕获Object*?在这种情况下,Object到底是什么? -
@ildjarn: 这个 Object* 事情是在 MSDN 上建议的
-
这与 C++ 的托管扩展相关,而不是 C++/CLI。两种不同的语言,假设您使用的是
gcnew,那么您使用的是 C++/CLI。 -
@ArneLund:另外,那篇 MSDN 文章不建议通过
Object*捕获。它对Object*的唯一说明是警告它不能正常工作。
标签: c# .net error-handling c++-cli