簡體   English   中英

在托管代碼中使用非托管代碼時處理錯誤(C++、C、C++/CLI、C#)

[英]Handling errors while using unmanaged code in a managed one ( C++, C, C++/CLI, C#)

我正在使用寫得很糟糕的第 3 方 (C/C++) Api。 我從托管代碼(C++/CLI)中使用它。 有時會出現“訪問沖突錯誤”。 這會導致整個應用程序崩潰。 我知道我無法處理這些錯誤[如果指針訪問非法 memory 位置等我該怎么辦]。

但我不希望我的應用程序整體崩潰。 至少如果有一個真正的問題,我的應用程序應該優雅地說“OK.I can't do my job.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;
}

如果您確定問題是庫中的錯誤,而不是由於您傳入了錯誤的 arguments,那么您最可靠的選擇是與加載庫的托管進程進行進程間通信。 這樣,您的操作系統進程分離可以防止庫導致您的應用程序崩潰。

您可以嘗試使用 SEH 在進程中捕獲訪問沖突,但如果庫寫入野指針而不是簡單的 null 指針,那么即使使用異常處理程序,該進程也將無法生存。

您的示例不會導致訪問沖突,它是堆棧上緩沖區的緩沖區溢出,因此相鄰的 memory 位置包含其他一些被踩踏的有效數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM