例外規格(Exception Specifications)


例外規格(Exception Specifications)指的是在函式定義時,宣告其將丟回某些類型的例外,當您宣告一個函式將丟回例外物件時,通常表示該函式中發生某些類型例外 時會將之丟出(函式中可能不處理,或是處理完後重新丟出),呼叫該函式的函式必須負責處理它所丟出的例外,另一方面,您也只能丟出函式上所指定的例外,這 意味著除了指定的例外之後,其它類型的例外您必須在函式中加以處理。

要宣告一個函式丟出例外,其語法如下:
return-type function throw (type1, type2, type3) {
    // ....
    throw type1;
    // ....
    throw type2;
    // ....
}

例外規格是函式定義的一部份,函式宣告式與定義式必須都寫出來,例如:
void divide(int, int) throw(DividedByZero);

void divide(int a, int b) throw(DividedByZero) {
    ....
}

例外的丟出是在執行時期引發的,當在執行時期丟出未列於例外規格中的例外時,unexpected()會被呼叫執行,它預設會呼叫terminate() 函式,結果就是終止程式。

如果想限制函式不丟出任何類型的例外,則在函式定義時使用throw,但不指定任何類型的例外,例如:
void function() throw() {
    ....
}

如此一來,所有的例外都不能從函式中丟出,所以例外的發生都必須在函式中捕捉並處理完畢。

在定義函式指標時,如果函式上有宣告例外規格,則例外規格也必須一併寫出,例如宣告一個可指向前例中divide的函式指標:
void (*fptr)(int, int) throw(DividedByZero);