我有一個疑問關於錯誤處理...如果從在其他函數內調用的函數拋出異常,會發生什麼情況?
如果一個函數拋出一個異常,並且在主程序中沒有捕獲到異常將會崩潰。
我的問題是爲什麼這個程序不會崩潰?如果從Test
函數enterNumber
拋出異常,即使它沒有被捕獲也會拋出異常?
不應該把每個可能拋出異常的函數放在try-catch塊中,以防萬一拋出異常嗎?
1°
#include <iostream>
#include <stdexcept>
void Test(int number) {
if(number < 0)
throw std::domain_error("Number is negative");
}
int enterNumber() {
int number;
std::cout << "Enter a number: ";
std::cin >> number;
Test(number);
return number;
}
int main() {
try {
int number = enterNumber();
std::cout << "Entered number: " << number;
}
catch(std::domain_error e) {
std::cout << e.what();
}
return 0;
}
我認爲應該這樣寫:
2°
void Test(int number) {
if(number < 0)
throw std::domain_error("Number is negative");
}
int enterNumber() {
int number;
std::cout << "Enter a number: ";
std::cin >> number;
try {
Test(number);
}
catch(...) {
throw;
}
return number;
}
int main() {
try {
int number = enterNumber();
std::cout << "Entered number: " << number;
}
catch(std::domain_error e) {
std::cout << e.what();
}
return 0;
}
如果有人可以解釋的功能enterNumber
如何拋出異常的情況下,Test
拋出它? (情況1°)
謝謝:)
按照C++設計工作。一個未被捕獲的函數使堆棧起泡。 –
例外可以讓功能冒出來。這是問題的主要原因之一。如果你沒有冒出主線,那麼你很好。 – NathanOliver
您的'嘗試{(number); } catch(...){ throw;'構造是完全沒有意義的。你捕獲所有的異常,只是立即重新拋出它們 - 就像你剛剛刪除了'try' /'catch'一樣。 –