2016-11-07 51 views
1

假設我的應用程序由3個組件組成。它們是:如何處理本地代碼的異常?

  1. C++本地庫
  2. C++ CLI管理庫,包裝機庫
  3. C#的GUI應用程序。

據我所知,從本地C++庫拋出的任何本地異常都將被SEHException託管類包裝。我對接下來的步驟感興趣,在創建這樣一個異常對象之後建議做的事情。

我應該在C++ cli託管庫中捕獲所有這些可能的異常,然後創建一個適當的託管異常嗎?這樣的事情:

void some_managed_action() 
{ 
    try 
    { 
     native_object->some_native_action(); 
    } 
    catch (const NativeException& e) 
    { 
     // What should I do with exception e and native object? before throwing new managed exception 
     // Will SEH wrapper automatically delete native exception object 
     // delete all native objects? 
     throw gcnew ManagedException(get_message(e)); 
    } 
} 

也許這種方法有一些陷阱?感謝您的任何建議。

+0

沒有明顯的理由在這個代碼進行任何更改。除了可能的異常類型名稱之外,「UnmanagedException」會變得更有意義,因爲它是從哪裏來的。除了錯誤報告之外,C#代碼不太可能對它做任何合理的處理,你可以提供更多的細節。 –

+0

@Hans Passant,據我所知,通過本地對象捕獲異常比通過approp更可取。包裹管理一個? docs說:如果一個非託管類型被catch(Object ^)捕獲,它不會銷燬拋出的對象。 – LmTinyToon

+1

當您在代碼段中寫入「NativeException」時,所有人都會認爲這是一種本機C++類型。這不僅僅是很好,它是必需的*從異常對象中獲取任何信息。通過例外而沒有任何相關信息是一個非常非常糟糕的主意。它仍然可以工作,但當然你的C#代碼不能做任何事情,只能終止程序。因此,本機異常對象是否泄露完全沒有關係。 –

回答

1

使用

try 
{ 
} 
catch (Exception ex) 
{ 
    // .NET exception 
} 
catch 
{ 
    // native exception 
} 

catch塊來處理異常捕捉所有公共語言 規範(CLS)兼容的異常。但是,它不會捕獲 不符合CLS的例外。不符合CLS的例外可能是 從本機代碼或由 Microsoft中間語言(MSIL)彙編程序生成的託管代碼拋出。請注意,C# 和Visual Basic編譯器不允許拋出不符合CLS的異常 ,並且Visual Basic不符合不符合CLS的 異常。如果catch塊的意圖是處理所有 異常,請使用以下常規catch塊語法。

C#:抓{}

CA2102: Catch non-CLSCompliant exceptions in general handlers

+0

這是很好的提及,我不知道,託管C++引發的異常應該由RuntimeWrappedException(而不是SEHException)包裝。 – LmTinyToon

+0

沒有多大意義,本機代碼永遠不會拋出託管異常。天堂禁止它發生。幸運的是,CLR很可能將它視爲CSE(已損壞的狀態異常),因此它永遠不會被捕獲。 –

+0

@HansPassant我不知道你的評論是寫給我的,但是從你的內容來看,我認爲這是假設的。操作可能讀這篇文章:https://msdn.microsoft.com/en-us/library/ms404228。aspx,因爲他提到了RuntimeWrappedException – mybirthname