假設我的應用程序由3個組件組成。它們是:如何處理本地代碼的異常?
- C++本地庫
- C++ CLI管理庫,包裝機庫
- 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));
}
}
也許這種方法有一些陷阱?感謝您的任何建議。
沒有明顯的理由在這個代碼進行任何更改。除了可能的異常類型名稱之外,「UnmanagedException」會變得更有意義,因爲它是從哪裏來的。除了錯誤報告之外,C#代碼不太可能對它做任何合理的處理,你可以提供更多的細節。 –
@Hans Passant,據我所知,通過本地對象捕獲異常比通過approp更可取。包裹管理一個? docs說:如果一個非託管類型被catch(Object ^)捕獲,它不會銷燬拋出的對象。 – LmTinyToon
當您在代碼段中寫入「NativeException」時,所有人都會認爲這是一種本機C++類型。這不僅僅是很好,它是必需的*從異常對象中獲取任何信息。通過例外而沒有任何相關信息是一個非常非常糟糕的主意。它仍然可以工作,但當然你的C#代碼不能做任何事情,只能終止程序。因此,本機異常對象是否泄露完全沒有關係。 –