![](/img/trans.png)
[英]How to get proper stack trace despite catch and throw; in std library
[英]Throw and catch std::string
我制作了奇怪的代碼,但令人驚訝的是它有效。 但現在我不知道我扔了什么,我怎么能抓住它:
class Date {
private:
int day;
int month;
int year;
int daysPerMonth[];
public:
Date( int day, int month, int year ) {
int daysPerMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if(isValidDate(day, month, year)) {
this->day = day;
this->month = month;
this->year = year;
} else {
throw std::string("No valid input date numbers...");//what i throw???
}
}
請幫我代碼。
您可以使用如下所示(未編譯): -
class Date {
private:
int day;
int month;
int year;
int daysPerMonth[];
public:
Date( int day, int month, int year ) {
int daysPerMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if(isValidDate(day, month, year))
{
this->day = day;
this->month = month;
this->year = year;
} else {
throw std::string("No valid input date numbers...");//what i throw???
}
}
};
int main()
{
try{
Date d(55,223,0122);
}
catch(std::string &e)
{
// Do necessary handling
}
}
在C ++中,您可以拋出任何類型的對象。 通常是std::exception
或從它派生的類型,但它可以是其他任何東西。 舉例來說CException
在MFC或_com_error
什么都沒有做std::exception
。 無論你扔什么,你必須抓住同樣的東西。 (你不能拋出一個std::string
並捕獲一個std::exception
。)
C ++允許您throw
任何類型的值(包括基本類型)。
try {
throw 42;
} catch(int e) {
std::cout << "Caught: " << e << "\n";
}
但與C ++中的許多其他內容一樣,僅僅因為你可以做到這一點,並不意味着你應該這樣做。
這里通常的建議是以某種方式拋出從std::exception
派生的專用異常對象。 也就是說,如果拋出的類型不應該在其他上下文中使用。 如果要將某個值與異常相關聯,請構建一個包含該值作為成員的異常包裝類,而不是直接拋出值的類型。
這個建議的基本原理是你想構建一個異常層次結構,允許捕獲不同的通用層:如果我對確切的異常類型不感興趣,我只需要捕獲std::exception
; 如果我只想處理某些類型的錯誤,我會在異常層次結構中進一步捕獲派生類。
如果保持異常類型與程序中使用的其他類型不同,則此類異常層次結構更容易維護和推理。 此外,這個指導方針使得人們濫用異常作為美化回報值的誘惑力降低,這是你永遠不應該做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.