針對C++異常的學習

源碼 頭文件??sdf_exception.h

#pragma once#include <exception>
#include <string>namespace sdf {namespace common{using sdf_error_code_t = uint32_t;class SdfException : std::exception{public:explicit SdfException(sdf_error_code_t errorCode) : error_code(error_code){};SdfException(sdf_error_code_t errorCode,std::string error_message){}SdfException(sdf_error_code_t x,sdf_error_code_t y,sdf_error_code_t z):error_code(pack211(x,y,z)){}SdfException(sdf_error_code_t x,sdf_error_code_t y,sdf_error_code_t z,std::string error_message){}const char *what() const noexcept override;sdf_error_code_t get_error_code() const{return error_code;}public:static sdf_error_code_t pack211(sdf_error_code_t x,sdf_error_code_t y,sdf_error_code_t z){return x << 16U | y << 8U | z;           //Appending u to any integral constant makes the compiler interpret it as unsigned.}private:sdf_error_code_t error_code;std::string error_message;bool error_message_packed = false;//< flag for lazy packing error message};}
}

學習

  • SdfException(sdf_error_code_t error_code) : error_code(error_code) {}這個是?C++ 類構造函數初始化列表?參考
  • const char * 、char const *、 char * const 三者的區別??參考鏈接??參考鏈接
  • const char *what() const ? ???參考鏈接
  • noexcept override;? ?參考鏈接??參考鏈接?參考鏈接?參考鏈接

源文件??sdf_exception.cpp

#include "sdf_exception.h"#include "logging.h"namespace sdf {
namespace common {std::string pack_error_message(sdf_error_code_t error_code,const std::string &error_message) {char buffer[1024];auto length =std::snprintf(buffer, sizeof(buffer), "sdf exception: [0x%08x] %s\n",error_code, error_message.c_str());if (length < 0 || length >= static_cast<int>(sizeof(buffer))) {log_fatal("Unexpected error message length: %s", length);}return buffer;
}SdfException::SdfException(sdf_error_code_t error_code,std::string error_message): error_code(error_code), error_message(std::move(error_message)) {}SdfException::SdfException(sdf_error_code_t x, sdf_error_code_t y,sdf_error_code_t z, std::string error_message): error_code(pack211(x, y, z)), error_message(std::move(error_message)) {}const char *SdfException::what() const noexcept {if (!error_message_packed) {const_cast<bool &>(error_message_packed) = true;const_cast<std::string &>(error_message) =pack_error_message(error_code, error_message);}return error_message.c_str();
}} // namespace common
} // namespace sdf

學習

  • snprintf()?參考鏈接
  • 淺析c++中的類型轉換--static_cast??參考鏈接
  • std::move?參考鏈接

代碼調用

代碼層次結構

所需要的配套文件

?logging.h

#pragma oncenamespace sdf {namespace common {enum LogLevel {SDF_LOG_DEBUG,SDF_LOG_INFO,SDF_LOG_WARN,SDF_LOG_ERROR,SDF_LOG_FATAL,SDF_LOG_IMPORTANT_INFO};void set_logging_level(LogLevel level);#define LOGGER_DECLARATION(level) void log_##level(const char *format, ...);LOGGER_DECLARATION(debug)LOGGER_DECLARATION(info)LOGGER_DECLARATION(warn)LOGGER_DECLARATION(error)LOGGER_DECLARATION(fatal)LOGGER_DECLARATION(important)#undef LOGGER_DECLARATION} // namespace common
} // namespace sdf

logging.cpp

#include "logging.h"
//#include "sdf_config.h"#include <cstdarg>
#include <cstdio>
#include <ctime>
#include <mutex>#ifdef ENABLE_SYSLOG
#include <syslog.h>
#endifnamespace sdf {namespace common {const char *get_current_time() {static char buffer[80];time_t raw_time;std::time(&raw_time);std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S",localtime(&raw_time));return buffer;}class Logger {public:static inline void set_logging_level(LogLevel level) {default_logging_level = level;}#ifndef ENABLE_SYSLOGstatic void vlog(LogLevel level, const char *format, va_list ap) {if (level < Logger::default_logging_level) {return;}auto endpoint = stdout;if (level == SDF_LOG_ERROR || level == SDF_LOG_FATAL) {endpoint = stderr;}const char *level_info = nullptr;switch (level) {case SDF_LOG_DEBUG:level_info = "DEBUG";break;case SDF_LOG_INFO:case SDF_LOG_IMPORTANT_INFO:level_info = "INFO";break;case SDF_LOG_WARN:level_info = "WARN";break;case SDF_LOG_ERROR:level_info = "ERROR";break;case SDF_LOG_FATAL:level_info = "FATAL";break;default:break;}std::lock_guard<std::mutex> lock(log_mutex);::fprintf(endpoint, "[%s][%s] ", get_current_time(), level_info);::vfprintf(endpoint, format, ap);::fprintf(endpoint, "\n");if (level == SDF_LOG_FATAL) {::abort();}}#elsestatic void vlog(LogLevel level, const char *format, va_list ap) {if (level < Logger::default_logging_level) {return;}int syslog_level = 0;switch (level) {case SDF_LOG_DEBUG:syslog_level = LOG_DEBUG;break;case SDF_LOG_INFO:syslog_level = LOG_INFO;break;case SDF_LOG_IMPORTANT_INFO:syslog_level = LOG_NOTICE;break;case SDF_LOG_WARN:syslog_level = LOG_WARNING;break;case SDF_LOG_ERROR:syslog_level = LOG_ERR;break;case SDF_LOG_FATAL:syslog_level = LOG_CRIT;break;default:break;}// std::lock_guard<std::mutex> lock(log_mutex);vsyslog(syslog_level, format, ap);if (level == SDF_LOG_FATAL) {::abort();}}#endifstatic inline void log(LogLevel level, const char *format, ...) {va_list ap;va_start(ap, format);vlog(level, format, ap);va_end(ap);}private:static LogLevel default_logging_level;static std::mutex log_mutex;};LogLevel Logger::default_logging_level = LogLevel::SDF_LOG_INFO;std::mutex Logger::log_mutex;void set_logging_level(LogLevel level) { Logger::set_logging_level(level); }#define LOGGER_DEFINITION(level, level_tag)                                    \void log_##level(const char *format, ...) {                                  \va_list ap;                                                                \va_start(ap, format);                                                      \Logger::vlog(level_tag, format, ap);                                       \va_end(ap);                                                                \}LOGGER_DEFINITION(debug, SDF_LOG_DEBUG)LOGGER_DEFINITION(info, SDF_LOG_INFO)LOGGER_DEFINITION(warn, SDF_LOG_WARN)LOGGER_DEFINITION(error, SDF_LOG_ERROR)LOGGER_DEFINITION(fatal, SDF_LOG_FATAL)LOGGER_DEFINITION(important, SDF_LOG_IMPORTANT_INFO)#undef LOGGER_DEFINITION} // namespace common
} // namespace sdf

?random_generator.cpp

#include "random_generator.h"#include "../common/sdf_exception.h"#include <string>
#include <iostream>std::string::size_type sdf::sys::GenerateRandom::NDSKeyStore_Common_GenerateRandom( size_t uiLength){std::cout << uiLength << std::endl;try {if(uiLength != 1024)
//            throw common::SdfException(-1);throw common::SdfException(45,"There is an error in the program, please solve it immediately!!");
//            throw common::SdfException(1,2,3);
//            throw common::SdfException(1,2,3,"There is an error in the program, please solve it immediately!");} catch (common::SdfException& e) {//        std::cerr<<"ERROR CODE:"<< e.get_error_code() << std::endl;std::cerr << e.what() << std::endl;}}

random_generator.h

#pragma once#include <cstddef>
#include <string>namespace sdf {namespace sys{class GenerateRandom {public:explicit GenerateRandom() = default;virtual ~GenerateRandom() = default;static std::string::size_type NDSKeyStore_Common_GenerateRandom(size_t uiLength);};}// namespace sys
}// namespace sdf

main函數調用

#include <iostream>
#include <sstream>#include "../src/algorithm/random/random_generator.h"
#include "../src/algorithm/common/StringBuffer.h"#define BUF_SIZE 1024
int main(){sdf::sys::GenerateRandom::NDSKeyStore_Common_GenerateRandom(1026);return 0;}

注意事項:

  • catch不一定需要緊緊跟著try

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447026.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android設計模式之——抽象工廠模式

一、介紹 抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09;&#xff0c;也是創建型設計模式之一。前一節我們已經了解了工廠方法模式&#xff0c;那么這個抽象工廠又是怎么一回事呢&#xff1f;大家聯想一下現實生活中的工廠肯定都是具體的&#xff0c;也就是說…

Android設計模式之——策略模式

一、介紹 在軟件開發中也常常遇到這樣的情況&#xff1a;實現某一個功能可以有多種算法或者策略&#xff0c;我們根據實際情況選擇不同的算法或者策略來完成該功能。例如&#xff0c;排序算法&#xff0c;可以使用插入排序、歸并排序、冒泡排序等。 針對這種情況&#xff0c;…

密碼學在區塊鏈隱私保護中的應用學習

身份隱私保護技術 混淆服務 混淆服務的目的在于混淆消息雙方的聯系&#xff08;如 圖 2 所示&#xff09;。當發送方需要告知接收方消息 M 時&#xff0c; 它會首先用接收方的公鑰 KB 加密 M&#xff0c;并在密文后 附帶真實接收地址 R。為了借助第三方&#xff08;圖 2 中的…

值類型和引用類型的區別

一、定義 引用類型表示你操作的數據是同一個&#xff0c;也就是說當你傳一個參數給另一個方法時&#xff0c;你在另一個方法中改變這個變量的值&#xff0c;那么調用這個方法是傳入的變量的值也將改變。 值類型表示復制一個當前變量傳給方法&#xff0c;當你在這個方法中改變…

面向區塊鏈的高效物化視圖維護和可信查詢論文學習

物化視圖介紹 如何維護物化視圖仍舊是一個開放問題.在關系數據庫中,增量刷新的物化視圖維護策略可劃分為立即維護和延遲維護兩大類.立即維護策略的優點是實現較為簡單,在單數據源下不 存在一致性問題;然而該策略將物化視圖維護過程嵌入到更新事務之中,延長了更新事務的提交時間…

Java基礎知識(一)

一、接口 類描述了一個實體&#xff0c;包括實體的狀態&#xff0c;也包括實體可能發出的動作。 接口定義了一個實體可能發出的動作。但是只是定義了這些動作的原型&#xff0c;沒有實現&#xff0c;也沒有任何狀態信息。 所以接口有點象一個規范、一個協議&#xff0c;是一個…

密碼學數字信封的介紹

對稱密碼和非對稱密碼 對稱密碼&#xff1a;加解密運算非常快&#xff0c;適合處理大批量數據&#xff0c;但其密碼的分發與管理比較復雜非對稱密碼&#xff1a;公鑰和私鑰分離&#xff0c;非常適合密鑰的分發和管理 數字信封的定義 如果將對稱密碼算法和非對稱密碼算法的優點…

Android設計模式之——狀態模式

一、介紹 狀態模式中的行為是由狀態來決定的&#xff0c;不同的狀態下有不同的行為。狀態模式和策略模式的結構幾乎完全一樣&#xff0c;但它們的目的、本質卻完全不一樣。狀態模式的行為是平行的、不可替換的&#xff0c;策略模式的行為是彼此獨立、可相互替換的。用一句話來…

Android設計模式之——責任鏈模式

一、介紹 責任鏈模式&#xff08;Iterator Pattern&#xff09;&#xff0c;是行為型設計模式之一。什么是”鏈“&#xff1f;我們將多個節點首尾相連所構成的模型稱為鏈&#xff0c;比如生活中常見的鎖鏈&#xff0c;就是由一個個圓角長方形的鐵環串起來的結構。對于鏈式結構…

目前基于區塊鏈的檔案防篡改系統的設計如何實現防篡改

架構設計圖 分析 為了保障檔案數據的安全性和隱私性&#xff0c;存儲檔案附件和檔案屬性存儲加密存儲在私有IPFS集群&#xff0c;檔案的IPFS地址和數字指紋存儲在私有區塊鏈上。公有區塊鏈定期存儲和檢查私有區塊鏈最新不可逆區塊的高度和哈希值&#xff0c;以保障私有區塊鏈上…

IPFS的文件存儲模式

IPFS是如何進行文件存儲的 IPFS采用的索引結構是DHT&#xff08;分布式哈希表&#xff09;&#xff0c;數據結構是MerkleDAG&#xff08;Merkle有向無環圖&#xff09; DHT(分布式哈希表) 參考鏈接MerkleDAG&#xff08;Merkle有向無環圖&#xff09; 參考鏈接MerkleDAG功能…

Android設計模式之——解釋器模式

一、介紹 解釋器模式&#xff08;Interpreter Pattern&#xff09;是一種用的比較少的行為型模式&#xff0c;其提供了一種解釋語言的語法或表達式的方式&#xff0c;該模式定義了一個表達式接口&#xff0c;通過該接口解釋一個特定的上下文。在這么多的設計模式中&#xff0c…

在Docker里面安裝Ubuntu,并且使用ssh進行連接

創建Ubuntu鏡像 1&#xff0c;拉取Ubuntu系統的鏡像 docker pull ubuntu2、查看拉取是否成功 docker images3&#xff0c;運行容器 docker run --name 新建的容器的名字 -ti -v /AAA:/BBB -d -p 3316:22 ubuntu(這個是鏡像的名字)宿主機根目錄中的AAA文件夾就映射到了容器…

Android設計模式之——命令模式

一、介紹 命令模式&#xff08;Command Pattern&#xff09;&#xff0c;是行為型設計模式之一。命令模式相對于其他的設計模式來說并沒有那么多的條條框框&#xff0c;其實它不是一個很”規范“的模式&#xff0c;不過&#xff0c;就是基于這一點&#xff0c;命令模式相對于其…

C++ 序列化和反序列化學習

定義 程序員在編寫應用程序的時候往往需要將程序的某些數據存儲在內存中&#xff0c;然后將其寫入某個文件或是將它傳輸到網絡中的另一臺計算機上以實現通訊。這些過程將會涉及到程序數據轉化成能被存儲并傳輸的格式&#xff0c;因此被稱為“序列化”&#xff08;Serializatio…

Android設計模式之——觀察者模式

一、介紹 觀察者模式是一個使用率非常高的模式&#xff0c;它最常用的地方是GUI系統、訂閱——發布系統。因為這個模式的一個重要作用就是解耦&#xff0c;將被觀察者和觀察者解耦&#xff0c;使得它們之間的依賴性更小&#xff0c;甚至做到毫無依賴。以GUI系統來說&#xff0…

Android設計模式之——備忘錄模式

一、介紹 備忘錄模式是一種行為模式&#xff0c;該模式用于保存對象當前狀態&#xff0c;并且在之后可以再次恢復到此狀態&#xff0c;這有點像我們平時說的”后悔藥“。備忘錄模式實現的方式需要保證被保存的對象狀態不能被對象從外部訪問&#xff0c;目的是為了保護好被保存…

c++ memory 頭文件詳細介紹

類 指針特征 pointer_traits (C11) 提供關于指針式類型的信息 (類模板) 垃圾收集器支持 pointer_safety (C11) 列出指針安全模式 (枚舉) 分配器 allocator 默認的分配器 (類模板) allocator_traits (C11) 提供關于分配器類型的信息 (類模板) allocator_arg_t (C11) 標簽類型…

C++ using的三種使用策略以及具體的用法

Using的使用方法 1&#xff0c;命名空間的使用 為了防止代碼沖突&#xff0c;都會使用到命名空間。假設這樣一種情況&#xff0c;當一個班上有兩個名叫 Zara 的學生時&#xff0c;為了明確區分他們&#xff0c;我們在使用名字之外&#xff0c;不得不使用一些額外的信息&#…

Android設計模式之——迭代器模式

一、介紹 迭代器模式&#xff08;Iterator Pattern&#xff09;又稱為游標&#xff08;Cursor&#xff09;模式&#xff0c;是行為型設計模式之一。迭代器模式算是一個比較古老的設計模式&#xff0c;其源于對容器的訪問&#xff0c;比如Java中的List、Map、數組等&#xff0c…