C 基礎 自製異常定位器

2021-07-07 02:56:00 字數 1818 閱讀 1021

我們經常會有這樣的需求,異常或錯誤(又或者記憶體洩露時)發生時,如何進行快速定位,定位到檔案一級、定位到函式一級、乃至定位到異常出現的行號一級。如此高大上的需求,只需要了解c++ preprocessor內建的一些巨集定義如__file__(檔名),__line__(行號),以及boost\current_function.hpp 中的boost_current_function(函式名),將這些巨集定義以引數的形式傳遞給乙個異常類,再施以一定的封裝,便可輕鬆實現對異常出現位置的捕捉。

#include 

#include

#include

using

namespace

std;

class error :public exception

;error::error(const

string& file, long line,

const

string& func, const

string& msg)

string format(const

string& file, long line,

const

string& func, const

string& msg)

const

char* error::what() const

客戶端程式:

double divide(double x, double y)

int main(int, char**)

catch(exception& e)

}

c++預處理器也提供了如下的巨集定義:

__date__

__time__

當然一種更常規的做法,利用巨集定義(也只能用巨集,而不可使用inline 內聯函式取代,不由分說的原樣替換雖然臭名昭著,卻也有時非它不可)的原樣替換的特性,對此做進一步的封裝,避免顯式傳參的動作:

#define fail(msg)\

std::ostringstream oss; \

oss << msg; \

throw error(__file__, __line__, boost_current_function,

oss.str());

#define assert(predicate, msg)\

if (!(predicate)) \

這樣客戶端**就可改寫為:

double divide(double x, double y)

return x / y;

}

因為fail巨集執行的動作是throw拋異常,如果不對之進行捕獲的話,將由編譯器進行捕獲:

int main(int, char**)

編譯器將彈出如下視窗:

0;}或者我們使用斷言的方式:

int main(int, char**)

catch(exception& e)

return

0;}

定位器有哪些作用

定位器有哪些作用 定位器在工業中應用廣泛,在眾多領域中起著重要的重作用,那麼,定位器有哪些作用呢?1 乙個調節器控制兩個執行器實行分程控制時,可用兩個定位器,分別接受低輸入訊號和高輸入訊號,則乙個執行器低程動作,另乙個高程動作,即構成了分程調節。2 用來改善調節閥的流量特性。3 當調節器與執行器距離...

Android URL 統一資源定位器

url指向的是網際網路上的各種資源,對這個資源可以進行乙個定位,通常就是乙個 方法 string getfile 獲取資源名 string gethost 獲取主機名 string getpath 獲取路徑部分 int getport 獲取埠號 string getprotocol 獲取協議名稱 s...

HTML 統一資源定位器

url 也被稱為 url uniform resource locator 解釋 scheme 定義網際網路服務的型別。最常見的型別是 http host 定義域主機 http 的預設主機是 www domain 定義網際網路網域名稱,比如 w3school.com.cn port 定義主機上的埠號...