2012-07-15 25 views
2

編輯:本書沒有錯,我只是沒有正確複製它提供的代碼。 try-catch塊應該放在while循環中,而我把它放在它之外。Stroustrup使用C++的PPP:第7章第7節(「從錯誤中恢復」)


也有一些是我可能會丟失約Stroutrup的「編程:原理與實踐使用C++」,在第7章,第7節(「從錯誤中恢復」)。我希望讀過這本書的人能夠幫助我(或者任何人,實際上!)。

我們開發了一個帶有令牌解析器的計算器。當程序讀取一個無效標記時,它就會終止。第7部分的目標是使計算器從這種錯誤中恢復而不終止。我的問題是,在遵循書中的指示後,計算器仍會在無效標記後終止。

Here是計算器的完整代碼。 Here是std_lib_facilities.h,以防你需要它來理解代碼。

正如你所看到的,main()要求calculate(),如果拋出異常(這發生在讀取無效令牌時發生),則calculate()又調用clean_up_mess()clean_up_mess()然後刪除Token_stream中的所有內容,直到找到print char(';'),因此我們可以繼續進行下一次計算,希望它不會包含另一個無效令牌。

但是,異常處理完成後,程序簡單地終止。我需要做些什麼來恢復拋出異常的位置?作者忘了解釋這個,還是我錯過了什麼?

謝謝。

+1

備註:確保你真的想要異常[在你開始使用它之前](http://stackoverflow.com/q/1744070/912144)。 – Shahbaz 2012-07-15 23:00:52

回答

4

處理異常後,C++繼續執行代碼catch塊。它不會從拋出異常的地方「恢復」。

的解決方案是移動try/catch內部calculate()while循環:

void calculate() 
{ 
    while (cin) { 
     try { 
      cout << prompt; 
      Token t = ts.get(); 
      while (t.kind == print) 
        t=ts.get(); 
      if (t.kind == quit) { 
        return; 
      } 
      ts.putback(t); 
      cout << result << expression() << endl; 
     } catch (exception& e) { 
      cerr << e.what() << endl; 
      clean_up_mess(); 
     } 
    } 
} 
+0

缺少一個'{'? – 2012-07-15 23:04:16

+0

對不起,錯過了編輯。固定。 – 2012-07-15 23:04:48

+0

謝謝。事實證明,書中提供的代碼確實如此,我沒有正確複製它。我現在覺得很愚蠢。 – Cutter 2012-07-15 23:12:12

1

這不是一個簡單的問題要解決。我的意思是,只是指出錯誤不會解決它。當你捕獲異常,你叫clean_up_mess()

catch (exception& e) 
{ 
     cerr << e.what() << endl; 
     clean_up_mess(); 
} 

然而,則函數只是退出。而在main()中,除了致電calculate()之外,您不會做任何其他事情,因此無論如何它都會結束。在你的clean_up_mess函數中,你只需讓流忽略有問題的條目,而不管其他什麼。

你必須把你的代碼放到一個循環中,這樣它才能夠執行。

1

在你的情況下,while循環讀取輸入是在try-catch塊內。因此,當引發異常時,循環終止,並且在處理異常後函數返回。你需要做的是將try-catch塊放在while循環中,以便繼續讀取和處理輸入。

相關問題