簡體   English   中英

為什么不會在DLL中捕獲此異常?

[英]Why is this exception not being caught across DLLs?

我有一個DLL拋出異常,如下所示:

throw POMException(err, drvErr, errmsg);

調用代碼在一個單獨的程序中,並有一個try,catch塊,如下所示:

try
{
    // function in separate DLL
}
catch (TXNPDO_Exception& e)
{
    SR_PERFLOG_MSG(SR_PERFMASK_SELECT, "ERROR selectInStages");
    TXNDBO_THROW(e);
}

在包含的文件中定義TXNPDO_Exception

#define TXNPDO_Exception POMException

在調試器中運行它時,它指出POMException未處理。 我甚至添加了一個catch(...)子句,但仍未處理。

我懷疑這與Visual C ++編譯參數有關,因為所討論的DLL庫是一個遺留庫,它是與調用它的程序分開編譯的。 我正在使用Visual Studio 2003。

DLL cpp文件使用以下(相關)標志進行編譯: /X /GR /Ob1 /Zi /GX /Od /MDd /LD 正確處理調用程序中的其他異常。

任何人都可以提供為什么這個異常沒有傳播到調用程序的原因?

編輯:

之前使用可能的構建環境和代碼更改編譯了DLL庫,這些更改對我來說是不可用的。 先前編譯的庫正確地傳播異常。

我正在使用相同的編譯器編譯客戶端程序,主要使用相同的開關: -Od -W3 -Z7 -MDd -GX -GR -Zm800 (no /X/Ob1/Z7而不是/Zi )。

我假設只有在相同的C ++運行時編譯各種.dll和程序可執行文件時才能跨越.dll邊界拋出異常,從而共享同一個堆。 我錯了,但這是我最好的猜測。

編輯:

我想我沒錯

我終於弄明白了問題是什么,在這種特殊情況下,它與在DLL之間拋出異常無關。

由於在調用堆棧中進一步安裝了異常處理程序掛鈎,因此會發生此問題。 我通過向庫中的每個級別添加try,catch(...)塊來診斷這一點,直到找到未傳播異常的點。 當我注釋掉異常處理程序鈎子注冊代碼時,異常成功傳播。

我現在必須弄清楚異常處理程序掛鈎的工作方式,這超出了本問題的范圍。 感謝所有分享他們答案的人。

暫無
暫無

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

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