2012-10-20 76 views
-1

有一種方法可以處理異常,然後在拋出異常的代碼中移動到下一行 ?C++ - 在不丟失調用堆棧的情況下處理異常

實施例:

try { 
    cout << "Test Begin! 1... 2... 3..." << endl; 
    throw "A text!"; 
    throw 1; 
    throw 2; 
    throw 3; 
    cout << "Yeah! Successful!!" << endl; 
} catch (char* text) { 
    cout << ch << endl; 
    ???(); //Go back to the previous line 
} 
catch (int i) { 
    cout << "Thrown " << i << endl; 
    ???(); //Go back to the previous line 
} 

的output'll是:

Test Begin! 1... 2... 3... 
A text! 
Thrown 1 
Thrown 2 
Thrown 3 
Yeah! Successful!! 
+2

當然,添加更多的try/catch塊。 –

回答

2

這不是異常是如何工作的。一個異常有效地從它拋出的函數中「返回」(更像是「退出」),清理本地分配的任何內存。這是try區塊中的一個獨特活動,沒有辦法。

我想說的是,您的設計可能不適合C++異常,您應該重新考慮如何在C++中解決問題,而不是以您想要解決的方式使語言工作問題。最終的結果肯定會是更乾淨的代碼。

調用堆棧可以,如果你圍繞throw相應的功能與一個try/catch調用,那麼只有解開一個函數調用,留給調用堆棧的其餘部分完好保留。

1

我認爲一個解決方案可以是寫一個函數來處理與每個輸入例外,並使用相同的每個語句例如

cout << "Test Begin! 1... 2... 3..." << endl; 
    handleException(A text!); 
    handleException(1); 
    handleException(2); 
    handleException(3); 
    cout << "Yeah! Successful!!" << endl; 

這裏handleException是/是自定義函數(S)與你的異常處理如下(只是舉例)

void handleException(int input){ 
     try { 
      thrown input; 
     }catch (int i) { 
      cout << "Thrown " << i << endl; 
     } 
    } 


    void handleException(char* input){ 
     try { 
      thrown input; 
     }catch (char* text) { 
      cout << "Thrown " << text << endl; 
     } 
    } 
+0

但是,如果我不想回滾callstack?無法確定異常之前的調用堆棧是什麼? – DividedByZero

+0

「我不想回滾調用堆棧」是什麼意思? –

+0

'if(x == 3)ThisThread :: CallStack :: RollBack();' – DividedByZero

1

longjmp和#定義:

#include <setjmp.h> 
#include <iostream> 

#define THROW_AND_GO_NEXT(action) \ 
    val=setjmp(env); \ 
    if (val==0) \ 
    action; 


using namespace std; 

int main() 
{ 
    jmp_buf env; 
    int val; 

    try { 
     cout << "Test Begin! 1... 2... 3..." << endl; 
     THROW_AND_GO_NEXT(throw "A text!"); 
     THROW_AND_GO_NEXT (throw 1); 
     THROW_AND_GO_NEXT(throw 2); 
     THROW_AND_GO_NEXT(throw 3); 
     cout << "Yeah! Successful!!" << endl; 
    } catch (const char* text) { 
     cout << text << endl; 
     longjmp(env,1); 
    } 
    catch (int i) { 
     cout << "Thrown " << i << endl; 
     longjmp(env,1); 
    } 
    return 0; 
} 

這是輸出:

>./a 
Test Begin! 1... 2... 3... 
A text! 
Thrown 1 
Thrown 2 
Thrown 3 
Yeah! Successful!! 
+0

在採用這種方法之前,還要看看[這個問題](http://stackoverflow.com/q/1376085/1025391)。 – moooeeeep

+0

你有沒有在我的腦海裏讀過;)我剛剛準備了相同的解決方案(http://ideone.com/tBsI39),但沒有什麼好玩的第二。我討厭「不能做」的答案 - 所以+1。 – PiotrNycz

1

號你問被稱爲可恢復例外,它們都在哪些catch子句可以告訴程序在簡歷處拋出,大概是因爲catch子句中的代碼修復了這個問題。 C++不支持可恢復的異常。從來沒有,永遠不會。 <g>

相關問題