2014-01-09 82 views
0

按照我的理解,在C++異常將被明確地用throw語句在C++函數簽名後使用throw的目的是什麼?

void exp() 
{ 
    try{  
     int a,b=0; 
     if(b==0) 
     { 
      throw b; // called explicity 
     } 
     a=10/b; 
    } 
    catch(...) 
    { 

     // cout<<"Exception called\n"<<e; 
    }  
} 

考慮下面的代碼片段致電:

void myfunction(.............)throw(SQLEXCEPTION) 
{ 
    //my stuff 
} 
  1. 什麼是後函數簽名使用投擲的目的。
  2. 哪裏可以爲此類投擲定義catch塊。
  3. 它會隱式處理異常嗎?
  4. 如果不處理隱含性,在哪些情況下拋出執行。

回答

-3

拋出的目的是程序員正在創建一個異常。

例如,你可以有一個自定義數組對象,檢查它是否在邊界內,如果它不是,則拋出異常。

+0

-1這不回答任何問題。 –

3

A throw()關於函數聲明的規範指出允許函數向調用者拋出哪個特定的異常。這是一種合約,因此呼叫者知道期望什麼。如果沒有指定throw(),則允許該函數拋出任何異常。如果throw()爲空,則不允許該函數拋出任何異常。所以,在你的例子中,myfunction()只允許拋出SQLEXCEPTION和派生的異常。

4

throw()函數簽名指定函數可以拋出的異常。

實施例:

void foo() throw(std::runtime_error, std::logic_error); 

throw()不帶參數表示該功能沒有拋出異常

異常規範已被棄用,不建議其使用。

2

函數簽名後使用throw(type-list)是這樣你還是誰將會閱讀你的代碼程序員都知道,這個功能只能扔掉,你在type-list specifed的類型。

void f()throw(){};// This function can not throw any object of any type. 
void f()throw(A){}; // you can throw any A object + 
        // any object of a type drived from A if A is a User-defined Type 

如果拋出一個類型,它是不是在異常規範的對象,std::unexpected()函數將被調用。

2-這裏沒有catch塊。函數簽名後的throw(type-list)只是保險,該函數不會拋出除type-list類型的對象之外的任何類型。

什麼你正在使用被稱爲異常規範,它的一個例子是使用是這樣的:

int f(int x)throw(int){ 
      if (x==0) throw 0; 
       return x; 
    } 

    int main(){ 
    try{ 
     f(0); 
     } 
    catch(int e){ 
    // something 
     } 
    } 

你可以記住兩兩件事:

我)不要使用異常規範因爲它們已被棄用。
ii)如果您必須使用它們,那麼現在您必須知道一些編譯器會因爲它有異常規範而拒絕內聯函數。


更新:

void f()throw(int){ 
     try{ 
     // code goes here ... 
     throw 1.1; // note this is throwing a float 
     } 
     catch(float){ 
     // exception handled 
     } 

    } 

在這個例子中,你不會得到任何錯誤,即使你扔float類型的異常,這是不是在功能異常規範規定只允許你拋出int類型的對象。這是因爲你在函數內處理了異常。


void f()throw(int){ 
     throw 1; 

} 
int main(){ 
     try{ 
      f(); 

     } 
     catch(int){// exception handled} 

} 

你應該始終把你認爲可能拋出try-block內異常的函數,上面的代碼將得到自f()執行罰款拋出int,它得到了處理。


void f()throw(int){ 

    throw 1.1; // note this is throwing a float 

} 

int main(){ 
    try{ 
     f(); 

    } 
    catch(...){//} 
} 

這將導致std::unexpected()函數調用,因爲你的函數f()float類型的異常是不是在功能異常規範。

+0

根據你的陳述「不會拋出除type-list中的類型對象之外的任何類型」但是,請看這裏我正在拋出char *它怎麼可能......它被catch塊捕獲http://ideone.com/h2msQ5 –

+0

@Vinoth在你的情況下,你在函數中拋出的對象總是在你的函數內部處理,這意味着exp()不會拋出任何異常。我們說一個函數在函數體內沒有處理時拋出一個異常。 – AlexDan

+0

「函數在函數體內部沒有處理時拋出異常」這個語句的意思是「如果任何異常不是由我們的函數處理,它會拋出程序不會崩潰」。是正確的。例如,如果在函數內部除以零,並且在函數簽名後拋出邏輯錯誤異常。該程序不會崩潰... –

相關問題