2015-10-20 42 views
4

C++標準庫定義了一些異常類型,如std::exception,std::bad_allocstd::logic_error。我們是否應該或允許在我們自己的代碼中使用它們?我們是否應該使用標準庫中的異常類型?

舉一個具體的例子。我們定義了一個類型Array,其中保存固定數量的int s並在「超出範圍」訪問權限上拋出std::out_of_range。它有一個成員函數Array::operator[](size_t i),這是這樣的定義:

int& Array::operator[](size_t i) { 
    if (i >= size) 
     throw std::out_of_range({ "out of range" }); 

    return array[i]; 
} 

我想,當然,我們可以使用它們(標準並沒有真正禁止這樣做),但它看起來像繪製斷章取義。國際海事組織,它類似於一個恆定

const unsigned int percentFactor = 100; 
它用於內存分配

char* ptr = new char[percentFactor]; 

percentFactor打算要爲了得到一個整數百分比結果與float/double成倍增加。如果它用於分配100 char s,它會給出預期結果,但兩個LOC完全不相關。例外情況也是如此。如果std::out_of_range僅用於標準庫中,並且我將在自己的代碼中使用它,那麼異常機制本身可以正常工作,但它不相關。

現在,我應該在我自己的程序/庫/ API中使用它們嗎?

+0

我已經多次閱讀過這個問題,仍然不明白標準異常類與常量整數和動態內存分配有什麼關係。 –

+0

@ChristianHackl'percentFactor'旨在乘以'float' /'double'以獲得整數百分比。在我的例子中,它用於內存分配,它完全**與百分比計算無關。想象一下,想要分配100個'char'並使用'percentFactor'。這給出了正確的結果,但實際上並不相關。與'std :: out_of_range'相同。如果它只是用於標準庫,但後來用於我自己的程序,它會工作,但它們完全不相關。誠然,它可能不是這個例子。 :-) – Downvoter

+0

@ChristianHackl更好的例子:想象一下,如果執行「超出範圍」訪問,則拋出一個'std :: bad_alloc'。異常機制本身可能工作得很好,但std :: bad_alloc實際上與「超出範圍」訪問無關。 – Downvoter

回答

6

答案是

std::out_of_range專爲此目的而設計。

您的所有例外都應該是從<stdexcept>或從其中的異常類派生。

編輯:

擴大有點...扔

  • 一個std::logic_error(或從中獲得的東西)意味着程序本身是不正確的(消費者代碼試圖做一些事情在設計參數之外)。

  • 一個std::runtime_error(或者其子類)意味着什麼企圖是合法的,但不可能在這個時候(例如,由於檔案遺失,或其他一些運行時問題)。

+0

這是隻有'std :: out_of_range'或者我可以使用其中的任何一個沒有進一步的研究? – Downvoter

+0

@cad請參閱上面的簡單說明,瞭解哪些應用以及何時使用。 –

相關問題