(八)boost庫之異常處理
當你面對上千萬行的專案時,當看到系統輸出了異常資訊時,你是否想過,如果它能將檔名、行號等資訊輸出,該多好啊,曾經為此絞盡腦汁。
今天使用boost庫,將輕鬆的解決這個問題。
1、boost異常的基本用法
先看看使用STL中的異常類的一般做法:
// 使用STL定義自己的異常
class MyException : public std::exception
{
public:
MyException(const char * const &msg):exception(msg)
{
}
MyException(const char * const& msg, int errCode):exception(msg, errCode)
{
}
};
void TestException()
{
try
{
throw MyException("error");
}
catch(std::exception& e)
{
std::cout << e.what() << std::endl;
}
}
boost庫的實現方案為:
//使用Boost定義自己的異常
#include <boost/exception/all.hpp>
class MyException : virtual public std::exception,virtual public boost::exception
{
};
//定義錯誤資訊型別,
typedef boost::error_info<struct tag_err_no, int> err_no;
typedef boost::error_info<struct tag_err_str, std::string> err_str;
void TestException()
{
try
{
throw MyException() << err_no(10) << err_str("error");
}
catch(std::exception& e)
{
std::cout << *boost::get_error_info<err_str>(e) << std::endl;
}
}
boost庫將異常類和錯誤資訊分離了,使得錯誤資訊可以更加靈活,其中typedef boost::error_info<struct tag_err_no, int> err_no;
定義一個錯誤資訊類,tag_err_no無實際意義,僅用於標識,為了讓同一型別可以例項化多個錯誤資訊類而存在。
2、使用boost::enable_error_info將標準異常類轉換成boost異常類
class MyException : public std::exception{};
#include <boost/exception/all.hpp>
typedef boost::error_info<struct tag_err_no, int> err_no;
typedef boost::error_info<struct tag_err_str, std::string> err_str;
void TestException()
{
try
{
throw boost::enable_error_info(MyException()) << err_no(10) << err_str("error");
}
catch(std::exception& e)
{
std::cout << *boost::get_error_info<err_str>(e) << std::endl;
}
}
有了boost的異常類,在丟擲異常時,可以塞更多的資訊了,如函式名、檔名、行號。
3、使用BOOST_THROW_EXCEPTION讓標準的異常類,提供更多的資訊
// 使用STL定義自己的異常
class MyException : public std::exception
{
public:
MyException(const char * const &msg):exception(msg)
{
}
MyException(const char * const & msg, int errCode):exception(msg, errCode)
{
}
};
#include <boost/exception/all.hpp>
void TestException()
{
try
{
//讓標準異常支援更多的異常資訊
BOOST_THROW_EXCEPTION(MyException("error"));
}
catch(std::exception& e)
{
//使用diagnostic_information提取所有資訊
std::cout << boost::diagnostic_information(e) << std::endl;
}
}
我們幾乎不用修改以前的異常類,就能讓它提供更多的異常資訊。
相關推薦
(八)boost庫之異常處理
當你面對上千萬行的專案時,當看到系統輸出了異常資訊時,你是否想過,如果它能將檔名、行號等資訊輸出,該多好啊,曾經為此絞盡腦汁。 今天使用boost庫,將輕鬆的解決這個問題。 1、boost異常的基本用法 先看看使用STL中的異常類的一般做法: // 使用
DPDK之(八)——vhost庫
設置 _id lba 系列 要求 是個 物理內存 文件描述符 合並 轉:http://www.cnblogs.com/danxi/p/6652725.html vhost庫實現了一個用戶空間的virtio net server,允許用戶直接處理virtio ring
(十二)boost庫之多執行緒高階特性
很多時候,執行緒不僅僅是執行一些耗時操作,可能我們還需要得到執行緒的返回值,一般的處理方法就是定義一個全域性狀態變數,不斷輪訓狀態,就如我目前維護的一個專案,全域性變數定義了N中狀態,看的讓人抓狂。該專案的大體邏輯是這樣的,啟動K個執行緒,當執行緒執行到某一個點時,進行輪
《Linux內核設計與實現》讀書筆記(八)- 中斷下半部的處理
sym dmesg 重新編譯 warn dad style lsp 之前 res 在前一章也提到過,之所以中斷會分成上下兩部分,是由於中斷對時限的要求非常高,需要盡快的響應硬件。 主要內容: 中斷下半部處理 實現中斷下半部的機制 總結中斷下半部的實現 中斷實現
(八)C語言之printf
inf pri http image 技術 info TP ima img (八)C語言之printf
(八)maven學習之繼承
nbsp 功能 有關 class 所有 情況 -m 項目執行 group 繼承 如果項目劃分了多個模塊,都需要依賴相似的jar包,只需要創建一個父模塊,在它的pom.xml文件中配置依賴的jar包。功能模塊只需要繼承父模塊,就可以自動得到其依賴的jar包
【Unity Shader】(八) ------ 高階紋理之立方體紋理及光線反射、折射的實現
筆者使用的是 Unity 2018.2.0f2 + VS2017,建議讀者使用與 Unity 2018 相近的版本,避免一些因為版本不一致而出現的問題。 【Unity Shader】(三) ------ 光照模型原理及漫反射和
機器學習 (八)kaggle競賽之泰坦尼克號專案實戰-1
引言 機器學習演算法都是為專案為資料服務的,某一個演算法都有它自己的適用範圍,以及優勢與劣勢,研究演算法由於平日的日常操練,那麼用它去做專案就如同上戰場殺敵一樣,去發揮它的價值,kaggle就是這樣一個刷怪升級
我的第一個python web開發框架(40)——後臺日誌與異常處理
1 #!/usr/bin/env python 2 # coding=utf-8 3 4 from bottle import put 5 from common import web_helper, encrypt_helper, security_helper 6
MyBatis的學習(八)——關聯對映之多對多關聯
本次多對多關聯在之前進行的一對一和一對多關聯基礎之上進行。 需求:根據班級課程查詢選修學生資訊 新建課程表和課程表與學生表的中間表 建立Course實體類: package com.little.entity; import java.util.ArrayL
Java筆記(三)內部類、異常處理、型別限定
今天我們先說一下內部類 內部類,就是類大的內部定義一個不與外部類同名的新類。在外部類內部使用內部類方式與普通類一樣。若要在其他位置使用,類名前要冠以外部類的名字,包括用new建立內部類的時候,用Person.new.Student()來建立。 大家都知道,在Java中是沒有指標的,那麼指
fiddler學習(八)-----------Response亂碼時的處理方法
問題:有時候我們看到Response中的HTML是亂碼的, 這是因為HTML被壓縮了, 我們可以通過兩種方法去解壓縮。 方法一:點選紅框內容“Response body is encouded.Click to decode.” 方法二:回到第一個tab
Python入門:模擬登入(二)或註冊之requests處理帶token請求
首先說一下使用python模擬登入或註冊時,對於帶token的頁面怎麼登入註冊模擬的思路: 1、對於帶token的頁面,需要先從最開始的頁面獲取合法token 2、然後使用獲取到的合法token進行
Python基礎(八)-系統程式設計之程序--multiprocessing(阻塞非阻塞)
程序擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,程序由作業系統排程。 執行緒擁有自己獨立的棧和共享的堆,共享堆,不共享棧,執行緒亦由作業系統排程(標準執行緒是的)。 協程和執行緒一樣共享堆,不共享棧,協程由程式設計師在協程的程式碼裡顯示排程 multiproces
Python爬蟲(四) URLError、HTTPError異常處理
1.URLError 首先解釋下URLError可能產生的原因: 網路無連線,即本機無法上網 連線不到特定的伺服器 伺服器不存在 在程式碼中,我們需要用try-except語句來包圍並捕獲相應的異常。下面是一個例子: import urllib.req
Android Multimedia框架總結(八)Stagefright框架之AwesomePlayer及資料解析器
前言:前面一篇分析了mediaplayerservice及MediaPlayer中的CS模型,但是對於如何能把資料解析出來,渲染到最終的SurfaceView上顯示,並且播放起來,我們依然還不得而知,從今天開始,就開始介紹多媒體框架中資料解析->解碼-
智慧指標(下)-----boost庫智慧指標,定製刪除器、迴圈引用
上一篇我們已經詳細講解了智慧指標的基礎性知識和auto_ptr的模擬實現。 今天呢我們來講解boost庫的發展。 在C++11標準出來之前,C++98標準中都一直只有一個智慧指標auto_ptr,我
Spark 系列(八)—— Spark SQL 之 DataFrame 和 Dataset
## 一、Spark SQL簡介 Spark SQL 是 Spark 中的一個子模組,主要用於操作結構化資料。它具有以下特點: + 能夠將 SQL 查詢與 Spark 程式無縫混合,允許您使用 SQL 或 DataFrame API 對結構化資料進行查詢; + 支援多種開發語言; + 支援
大資料之Spark(八)--- Spark閉包處理,部署模式和叢集模式,SparkOnYarn模式,高可用,Spark整合Hive訪問hbase類載入等異常解決,使用spark下的thriftserv
一、Spark閉包處理 ------------------------------------------------------------ RDD,resilient distributed dataset,彈性(容錯)分散式資料集。 分割槽列表,function,dep Op
python爬蟲從入門到放棄(八)之 Selenium庫的使用
自動 .com 程序 png 都是 例子 等待 點擊 哪些 一、什麽是Selenium selenium 是一套完整的web應用程序測試系統,包含了測試的錄制(selenium IDE),編寫及運行(Selenium Remote Control)和測試的並行處理(Sele