由于我的C ++代码中有一些C#依赖关系,我被迫使用CLI。 在此依赖关系出现之前,我编写了一个异常,该异常继承自std :: exception。现在,每当我抛出此异常时,程序就会崩溃,并出现来自ntd.dll的访问冲突异常。
因此,我将包含异常的头文件放在新的CLI项目中,并尝试对其进行编译。这给了我一个错误,即“ exception”不是std的成员。在包含<exception>
之后,这个错误消失了(当然),但是我想知道为什么以前没有必要这样做。
无论如何,这是我在基本示例中的代码:
异常标头:
#pragma once
#include <exception>
//Device is offline
struct E_DvcOffline : public std::exception
{
const char * what() const throw ()
{
return "The Device is offline";
}
};
主要功能:
#include <MyExceptions.hpp>
#include <iostream>
using namespace System;
int main(array<String^>^ args) {
try {
throw E_DvcOffline();
}
catch (E_DvcOffline) {
std::cout << "Caught it" << std::endl;
std::cin.get();
}
}
当代码引发自定义异常时,还会收到异常:
Not able to embed pictures yet...
预先感谢, 加尔文
编辑
throw new E_DvcOffline();
更改为throw E_DvcOffline();
答案 0 :(得分:1)
我能够解决此问题。
#pragma once
**#pragma managed(push, off)**
#include <exception>
//Device is offline
struct E_DvcOffline : public std::exception
{
const char * what() const throw ()
{
return "The Device is offline";
}
};
**#pragma managed(pop)**
变化是螺栓。 我没有进行搜索,但是我认为这告诉编译器将此代码视为非托管代码,因此调用了本机异常处理程序。
警告:当您在调试模式下逐步执行代码时,Visual Studio最终将产生与以前相同的错误。否则一切正常。