2011-12-01 86 views
4

我有拋出一個異常,像這樣一個DLL:爲什麼這個異常沒有被DLL捕獲?

throw POMException(err, drvErr, errmsg); 

調用代碼是在一個單獨的程序,並且有一個嘗試,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(無/X/Ob1/Z7代替/Zi)。

+1

C++功能得不到DLL的很好的支持。 –

+0

這可能取決於'POMException'是什麼...... – AJG85

+1

/EH在哪​​裏?需要。 –

回答

1

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

由於將異常處理程序掛接安裝在調用堆棧的上游,因此出現問題。我通過向庫中的每個級別添加try,catch(...)塊來診斷這一點,直到找到不傳播異常的點。當我註釋掉異常處理程序鉤子註冊碼時,異常被成功傳播。

我現在必須弄清楚異常處理程序鉤子的工作情況,這不在此問題的範圍之內。感謝所有分享他們答案的人。

2

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

編輯:

我想我是不是wrong

+0

我可以說客戶端和DLL是由相同的編譯器編譯的。至於相同的C++運行時。兩者都使用'/ MDd'編譯。這不表示C++運行時庫嗎? – tvStatic

+0

@tvStatic:庫的相同版本?使用相同的設置? –

+0

@tvStatic那麼在你的問題中,你確實提到了單獨的編譯,那是「使用」的工作。這使我相信運行時間是不同的。還/單獨MDD沒有幫助。也許一些補丁被應用到編譯器和客戶端或.dll後編譯? – FailedDev