簡體   English   中英

拋出並捕獲std :: string

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM