2013-04-05 50 views
4

我正在學習C++ 11標準。我想了解error_code和errno是否相互關聯?如果是,那麼如何? 如果沒有,那麼我應該在哪些條件下設置errno並在哪些條件下設置error_code?error_code vs errno

我做了一個小測試程序來理解這一點,但仍然有點困惑。請幫忙。這些功能是C庫或OS功能從未拋出異常 -

#include <iostream> 
#include <system_error> 
#include <thread> 
#include <cstring> 
#include <cerrno> 
#include <cstdio> 

using namespace std; 

int main() 
{ 
    try 
    { 
     thread().detach(); 
    } catch (const system_error & e) { 
     cout<<"Error code value - "<<e.code().value()<<" ; Meaning - "<<e.what()<<endl; 
     cout<<"Error no. - "<<errno<<" ; Meaning - "<<strerror(errno)<<endl; 
    } 
} 

Output - 
Error code value - 22 ; Meaning - Invalid argument 
Error no. - 0 ; Meaning - Success 
+1

您的標題引用了所謂的'error_code',但您的代碼沒有提及它。 – 2013-04-05 06:14:28

+1

@Keith:e.code()函數返回error_code的對象,它的值正在用值函數讀取。 – tshah06 2013-04-05 06:20:07

回答

6

errno由那些記錄,作爲其遇到錯誤的副作用的功能使用。 system_error是由C++標準庫使用的,當你使用圖書館設施來記錄該異常時。完全分開。最終,閱讀您的文檔!

+0

那麼我們可以方便地說那些設置error_code的庫函數不會使用/設置errno嗎? – tshah06 2013-04-05 06:22:29

+4

@ tshah06'error_code'沒有被設置。它是'system_error'異常屬性的類型(def)。但是我們可以方便地說庫函數*拋出'system_error'異常*從不使用/設置'errno'。這種雙重性的存在只是因爲你可以從C++調用C函數(通過errno執行C風格的錯誤處理)。在「純粹的」C++異常中是錯誤處理機制的選擇,所以「純粹的」C++程序將永遠不必處理「errno」。 – 2013-04-05 06:31:32

+0

@Arne:有道理。我想現在我已經很清楚了。謝謝。 – tshah06 2013-04-05 07:01:37