C++ Boost System超詳細(xì)講解
一、說明
以下庫(kù)支持錯(cuò)誤處理。
- Boost.System 提供類來(lái)描述和識(shí)別錯(cuò)誤。自 C++11 以來(lái),這些類已成為標(biāo)準(zhǔn)庫(kù)的一部分。
- Boost.Exception 使得在拋出異常后附加數(shù)據(jù)成為可能。
二、關(guān)于 Boost.System庫(kù)
Boost.System 是一個(gè)庫(kù),本質(zhì)上定義了四個(gè)類來(lái)識(shí)別錯(cuò)誤。所有四個(gè)類都已添加到 C++11 的標(biāo)準(zhǔn)庫(kù)中。如果您的開發(fā)環(huán)境支持 C++11,則無(wú)需使用 Boost.System。然而,由于許多 Boost 庫(kù)使用 Boost.System,您可能會(huì)通過其他庫(kù)遇到 Boost.System。
boost::system::error_code 是 Boost.System 中最基本的類;它表示特定于操作系統(tǒng)的錯(cuò)誤。因?yàn)椴僮飨到y(tǒng)通常會(huì)枚舉錯(cuò)誤,所以 boost::system::error_code 將錯(cuò)誤代碼保存在一個(gè) int 類型的變量中。示例 55.1 說明了如何使用此類。
示例 55.1。使用 boost::system::error_code
#include <boost/system/error_code.hpp> #include <iostream> using namespace boost::system; void fail(error_code &ec) { ec = errc::make_error_code(errc::not_supported); } int main() { error_code ec; fail(ec); std::cout << ec.value() << '\n'; }
示例 55.1 定義了用于返回錯(cuò)誤的函數(shù) fail()。為了讓調(diào)用者檢測(cè) fail() 是否失敗,boost::system::error_code 類型的對(duì)象通過引用傳遞。 Boost 庫(kù)提供的許??多函數(shù)都像這樣使用 boost::system::error_code。例如,Boost.Asio 提供函數(shù) boost::asio::ip::host_name(),您可以將類型為 boost::system::error_code 的對(duì)象傳遞給該函數(shù)。
Boost.System 在命名空間 boost::system::errc 中定義了許多錯(cuò)誤代碼。示例 55.1 將錯(cuò)誤代碼 boost::system::errc::not_supported 分配給 ec。因?yàn)?boost::system::errc::not_supported 是一個(gè)數(shù)字,而 ec 是 boost::system::error_code 類型的對(duì)象,所以函數(shù) boost::system::errc::make_error_code() 被調(diào)用。此函數(shù)使用相應(yīng)的錯(cuò)誤代碼創(chuàng)建一個(gè)類型為 boost::system::error_code 的對(duì)象。
在 main() 中,value() 在 ec 上被調(diào)用。此成員函數(shù)返回存儲(chǔ)在對(duì)象中的錯(cuò)誤代碼。
默認(rèn)情況下,0 表示沒有錯(cuò)誤。每隔一個(gè)數(shù)字表示一個(gè)錯(cuò)誤。錯(cuò)誤代碼值取決于操作系統(tǒng)。有關(guān)錯(cuò)誤代碼的說明,請(qǐng)參閱操作系統(tǒng)的文檔。
除了 value() 之外,boost::system::error_code 還提供了成員函數(shù) category(),它返回一個(gè) boost::system::error_category 類型的對(duì)象。
錯(cuò)誤代碼只是數(shù)值。雖然 Microsoft 等操作系統(tǒng)制造商能夠保證系統(tǒng)錯(cuò)誤代碼的唯一性,但應(yīng)用程序開發(fā)人員幾乎不可能在所有現(xiàn)有應(yīng)用程序中保持錯(cuò)誤代碼的唯一性。這將需要一個(gè)中央數(shù)據(jù)庫(kù),其中包含來(lái)自世界各地所有軟件開發(fā)人員的錯(cuò)誤代碼,以避免為不同的錯(cuò)誤重復(fù)使用相同的代碼。因?yàn)檫@是不切實(shí)際的,所以存在錯(cuò)誤類別。
boost::system::error_code 類型的錯(cuò)誤代碼屬于可以使用成員函數(shù) category() 檢索的類別。使用 boost::system::errc::make_error_code() 創(chuàng)建的錯(cuò)誤自動(dòng)屬于通用類別。如果錯(cuò)誤未明確分配給另一個(gè)類別,則這是錯(cuò)誤所屬的類別。
示例 55.2。使用 boost::system::error_category
#include <boost/system/error_code.hpp> #include <iostream> using namespace boost::system; void fail(error_code &ec) { ec = errc::make_error_code(errc::not_supported); } int main() { error_code ec; fail(ec); std::cout << ec.value() << '\n'; std::cout << ec.category().name() << '\n'; }
如示例 55.2 所示,category() 返回錯(cuò)誤的類別。這是一個(gè)類型為 boost::system::error_category 的對(duì)象。只有幾個(gè)成員函數(shù)。例如,name() 檢索類別的名稱。示例 55.2 將泛型寫入標(biāo)準(zhǔn)輸出。
您還可以使用獨(dú)立函數(shù) boost::system::generic_category() 來(lái)訪問通用類別。
Boost.System 提供了第二類。如果您調(diào)用獨(dú)立函數(shù) boost::system::system_category(),您將獲得對(duì)系統(tǒng)類別的引用。如果您將類別的名稱寫入標(biāo)準(zhǔn)輸出,則會(huì)顯示系統(tǒng)。
錯(cuò)誤由錯(cuò)誤代碼和錯(cuò)誤類別唯一標(biāo)識(shí)。因?yàn)殄e(cuò)誤代碼只需要在一個(gè)類別中是唯一的,所以只要您想要定義特定于您的程序的錯(cuò)誤代碼,就應(yīng)該創(chuàng)建一個(gè)新類別。這使得使用不干擾其他開發(fā)人員的錯(cuò)誤代碼的錯(cuò)誤代碼成為可能。
示例 55.3。創(chuàng)建錯(cuò)誤類別
#include <boost/system/error_code.hpp> #include <string> #include <iostream> class application_category : public boost::system::error_category { public: const char *name() const noexcept { return "my app"; } std::string message(int ev) const { return "error message"; } }; application_category cat; int main() { boost::system::error_code ec{129, cat}; std::cout << ec.value() << '\n'; std::cout << ec.category().name() << '\n'; }
通過創(chuàng)建從 boost::system::error_category 派生的類來(lái)定義新的錯(cuò)誤類別。這需要您定義各種成員函數(shù)。至少必須提供成員函數(shù) name() 和 message(),因?yàn)樗鼈冊(cè)?boost::system::error_category 中被定義為純虛擬成員函數(shù)。對(duì)于其他成員函數(shù),如果需要,可以覆蓋默認(rèn)行為。
name() 返回錯(cuò)誤類別的名稱,而 message() 用于檢索特定錯(cuò)誤代碼的錯(cuò)誤描述。與示例 55.3 不同,通常評(píng)估參數(shù) ev 以返回基于錯(cuò)誤代碼的描述。
新創(chuàng)建的錯(cuò)誤類別類型的對(duì)象可用于初始化錯(cuò)誤代碼。示例 55.3 使用新類別 application_category 定義錯(cuò)誤代碼 ec。因此,錯(cuò)誤代碼 129 不再是一般錯(cuò)誤;相反,它的含義由新錯(cuò)誤類別的開發(fā)人員定義。
注意
要使用 Visual C++ 2013 編譯示例 55.3,請(qǐng)刪除關(guān)鍵字 noexcept。此版本的 Microsoft 編譯器不支持 noexcept。
boost::system::error_code 提供了一個(gè)名為 default_error_condition() 的成員函數(shù),它返回一個(gè)類型為 boost::system::error_condition 的對(duì)象。 boost::system::error_condition 的接口幾乎與 boost::system::error_code 的接口相同。唯一的區(qū)別是成員函數(shù) default_error_condition(),它僅由 boost::system::error_code 提供。
示例 55.4。使用 boost::system::error_condition
#include <boost/system/error_code.hpp> #include <iostream> using namespace boost::system; void fail(error_code &ec) { ec = errc::make_error_code(errc::not_supported); } int main() { error_code ec; fail(ec); boost::system::error_condition ecnd = ec.default_error_condition(); std::cout << ecnd.value() << '\n'; std::cout << ecnd.category().name() << '\n'; }
boost::system::error_condition 就像 boost::system::error_code 一樣使用。這就是為什么可以為類型為 boost::system::error_condition 的對(duì)象調(diào)用成員函數(shù) value() 和 category() 的原因,如示例 55.4 所示。
類 boost::system::error_code 用于與平臺(tái)相關(guān)的錯(cuò)誤代碼,而 boost::system::error_condition 用于訪問與平臺(tái)無(wú)關(guān)的錯(cuò)誤代碼。成員函數(shù) default_error_condition() 將依賴于平臺(tái)的錯(cuò)誤代碼轉(zhuǎn)換為類型為 boost::system::error_condition 的平臺(tái)無(wú)關(guān)錯(cuò)誤代碼。
您可以使用 boost::system::error_condition 來(lái)識(shí)別與平臺(tái)無(wú)關(guān)的錯(cuò)誤。例如,此類錯(cuò)誤可能是對(duì)不存在文件的訪問失敗。雖然操作系統(tǒng)可能提供不同的接口來(lái)訪問文件并可能返回不同的錯(cuò)誤代碼,但嘗試訪問不存在的文件在所有操作系統(tǒng)上都是錯(cuò)誤的。從操作系統(tǒng)特定接口返回的錯(cuò)誤代碼存儲(chǔ)在 boost::system::error_code 中。描述訪問不存在文件失敗的錯(cuò)誤代碼存儲(chǔ)在 boost::system::error_condition 中。
Boost.System 提供的最后一個(gè)類是 boost::system::system_error,它派生自 std::runtime_error。它可用于在異常中傳輸類型為 boost::system::error_code 的錯(cuò)誤代碼。
示例 55.5。使用 boost::system::system_error
#include <boost/system/error_code.hpp> #include <boost/system/system_error.hpp> #include <iostream> using namespace boost::system; void fail() { throw system_error{errc::make_error_code(errc::not_supported)}; } int main() { try { fail(); } catch (system_error &e) { error_code ec = e.code(); std::cerr << ec.value() << '\n'; std::cerr << ec.category().name() << '\n'; } }
在示例 55.5 中,獨(dú)立函數(shù) fail() 已更改為在出現(xiàn)錯(cuò)誤時(shí)拋出類型為 boost::system::system_error 的異常。此異??梢詡鬏旑愋蜑?boost::system::error_code 的錯(cuò)誤代碼。異常在 main() 中捕獲,它將錯(cuò)誤代碼和錯(cuò)誤類別寫入標(biāo)準(zhǔn)錯(cuò)誤。函數(shù) boost::asio::ip::host_name() 的第二個(gè)變體就像這樣工作。
到此這篇關(guān)于C++ Boost System超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++ Boost System內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言正則表達(dá)式詳解 regcomp() regexec() regfree()用法詳解
C語(yǔ)言處理正則表達(dá)式常用的函數(shù)有regcomp()、regexec()、regfree()和regerror(),這里就為大家介紹一下,需要的朋友可以參考一下啊2018-04-04C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(一)
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法中的插入類和交換類的各種排序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12C/C++實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法
在C/C++程序中,會(huì)需要把數(shù)字與字符串做出互相轉(zhuǎn)換的操作,用于實(shí)現(xiàn)程序想要的效果,下面將介紹多種方法實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-08-08C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Qt5.9實(shí)現(xiàn)簡(jiǎn)單復(fù)合圖形
這篇文章主要為大家詳細(xì)介紹了Qt5.9實(shí)現(xiàn)簡(jiǎn)單復(fù)合圖形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07