在托管代码中使用非托管代码时处理错误(C++,C,C++/CLI,C#)

Nov*_*lis 6 c# c++ exception-handling exception

我正在使用写得不好的第三方(C/C++)Api.我在托管代码(C++/CLI)中使用它.有时会获得"访问冲突错误".这个崩溃整个应用程序.我知道我无法处理这些错误[如果指针访问非法内存位置等我该怎么办].

但我不希望我的应用程序整体崩溃.至少如果存在真正的问题,我的应用程序应该优雅地说"OK.我不能完成我的工作.BYE.":-)然后它最少执行一些替代方案并最终关闭自己.

但似乎没有办法,抓住(可能是错误的术语,可能会被告知有关严重的一词)访问违规和类似的错误.是否有办法了解这些错误.所以我可以执行我的替代风格.

PS:标准异常处理无法解决此问题.

#include "stdafx.h"
#include <iostream>

using namespace System;

using namespace std;


static void ThrowingManagedException()
{

    throw gcnew ArgumentException("For no good reason");

}

static void ThrowingNativeException()
{

    throw std::exception("For no good reason");



}

static void SomeBadThingsHappen()
{

    short a[1]; 

    a[0]=1;

    a[2]= 2; // SomeOne make stupid mistake

}

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Test Exceptions");

    try 
    {

        SomeBadThingsHappen();
         //ThrowingNativeException();         
         //ThrowingManagedException();
    }


    catch(Exception^ e)
    {
        Console::WriteLine("Something awful happened: "+ e);
    }


    Console::WriteLine("Press enter to exit");
    Console::Read();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 4

如果您确定问题是库中的错误,而不是您传递错误参数的结果,那么最可靠的选择是与加载库的托管进程进行进程间通信。这样,您的操作系统进程分离可以防止库导致您的应用程序崩溃。

您可以尝试使用 SEH 捕获进程内的访问冲突,但如果库写入的是野指针而不是简单的空指针,那么即使使用异常处理程序,该进程也将无法生存。

您的示例不会导致访问冲突,它是堆栈上缓冲区的缓冲区溢出,因此相邻的内存位置包含一些其他被踩踏的有效数据。