2011-10-27 95 views
1

我已經註冊了3個處理器與expat解析器: - 啓動 末端 - 文本Expat解析器 - C++ -Exception處理

而且從主程序,我讀了xml文件,緩衝,並調用API XML_Parse 。 事情是這樣的:

try { 
if(! XML_Parse (....)) 
{ 
    // throw user-defined expection here 
} 
catch(...) 
{ 
} 
} // end of try 
catch(...) 
{ 
} 

如果XML_Parse失敗時返回0,一個異常被從裏面是否拋出。它被捕獲在內部的捕獲塊。

這是我的問題: 如果用戶定義的異常在解析過程中從任何處理程序拋出,是否會被捕獲到外部捕獲?

如果是,它實際上不在我的代碼中發生。相反,它是傾銷核心和堆棧顯示拋出導致std:terminate。 在拋出HANDLERS異常之前,我還必須執行其他任何操作。

謝謝。

回答

0

你有trycatch之間的不匹配:每個try塊後面至少一個catch塊,但你只有一個try。也許是這樣的:

try 
{ 
    // stuff before 

    try 
    { 
    if (!parse()) 
    { 
     // ... 
    } 
    } 

    // further catch blocks? 

    catch(...) 
    { 
    // may rethrow 
    } 

    // stuff after 
} 

注意,匿名catch(...)通常不是很好的設計 - 你要麼知道您的期望,可以處理,或者你並不需要抓住它。關於匿名catch的唯一有用的事情是記錄異常並重新拋出它。

+0

對不起。沒有內在的捕獲。只有一個接下來的嘗試。所以,有兩個地方可以拋出異常。一個來自內部,另一個來自任何一個處理者。那麼,從HANDLERS拋出異常時它的行爲如何呢? –

+0

此外,匿名捕獲只是爲了描述問題。我有適當的catch塊處理拋出的對象。我主要關心的是如果處理者拋出異常會發生什麼? –

0

如果您從try{/*stuff*/}塊中拋出異常並且throw被深度嵌套,堆棧將一直展開到匹配的外部函數catch(...)函數。如果您的處理程序已分配了堆內存,則需要使用shared_ptr<>或明確刪除,仔細處理。如果您的處理程序位於try區塊內,則該異常應該正常運行。

0

你必須非常小心。 (這導致了一些很難找到我正在處理的代碼中的問題。)。在我的情況下,我必須使用的expat庫不是使用gcc中必需的異常標誌構建的,並且由於expat是C(而不是C++),它不知道如何處理異常 - 當發生應用程序剛剛終止。

但是,如果你可以用正確的gcc標誌來構建expat,那麼所有應該都可以。 (重建expat對我來說是不可能的,所以我改用了使用libxml2的DOM解析)。