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

标签 c# c++ exception exception-handling

我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,我该怎么办]。

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

但似乎没有办法捕获(可能是错误的术语,正确的词可能是被告知)访问冲突和类似的错误。有没有办法被告知这些错误。所以我可以执行我的替代方案。

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;
}

最佳答案

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

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

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

关于c# - 在托管代码(C++、C、C++/CLI、C#)中使用非托管代码时处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6710686/

相关文章:

c# - 用于编译时间行号的 Postsharp

c++ - C预处理器如何将函数宏视为字符串

c++ - 演示代码抛出 out_of_range 异常,但我不知道为什么

java - 尽管处理了异常错误

Python 仍然抛出我已明确排除的异常

c# - 将 Xamarin Forms 安卓版移植到黑莓 10

c# - 如何复制html页面

c# - microsoft.bcl.simd 发生了什么?

c++ - std::string operator+() 内存泄漏?

c++ - 如何访问嵌套类