1. 程式人生 > >(八)boost庫之異常處理

(八)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;
    }
}

image

我們幾乎不用修改以前的異常類,就能讓它提供更多的異常資訊。

相關推薦

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