2017-06-22 105 views
0

所以我有一個模板類此功能:的std :: out_of_range異常怪異輸出

T getValue(int x, int y) const throw(logic_error, out_of_range) { // value getter 
    try { 
     if (x > rows || y > cols || x <= 0 || y <= 0) 
      throw out_of_range("Invalid x or y."); 
     else 
      return data[cols*(x-1)+(y-1)]; 
    } catch (out_of_range& e) { 
     cerr << e.what() << endl; 
    } 
} 

例外作品,如果我嘗試給它一個超出範圍的數字,但輸出始終是:

Invalid x or y. 
1 

我一直在嘗試一個小時,弄清楚那個1從哪裏來,我錯過了什麼世界?它當然與std :: out_of_range有關,但我無法找出究竟是什麼。

編輯這是關於一個模板矩陣:

Matrix<int> a(2, 2, 0); // creates a 2x2 matrix of all zeros 
cout << a.getValue(3, 2) << endl; // prints the value at row 3, col 2, which doesn't actually exists; the output is as shown above 

此外,值得注意的是,

int b = a.getValue(3, 2); 

給出預期輸出:

​​
+0

添加'返回3;'只是'getValue'右花括號之前並再次運行代碼。這應該清楚發生了什麼事情。 –

+0

做過了;現在輸出的數字是3,所以我得到的是一個流氓回報值。爲什麼我得到那個?如果函數不能繼續,那麼是否有例外可以幫助我避免返回任何值? – Zelethil

+0

@Zelethil - 代碼捕獲異常。正常執行繼續在catch子句之後。而且,是的,1是一種流氓回報價值。運行應該返回值的函數的末尾會產生未定義的行爲。在實踐中,您最終會看到預期返回值的寄存器中發生的任何值。 –

回答

0

加入

解決它
exit(-1); 

到catch塊:

catch (out_of_range &e) { 
    cerr << e.what() << endl; 
    exit(-1); 
}