当前位置: 首页 > news >正文

一流的铁岭做网站公司新媒体营销推广公司

一流的铁岭做网站公司,新媒体营销推广公司,郑州定制网站推广工具产品,佛山市seo推广营销工具目录 1.自定义异常类spdlog_ex 1.1.通用异常 1.2.系统调用异常 1.3.what()函数 2.异常的使用 2.1.抛出异常 2.2.控制异常使用 1.自定义异常类spdlog_ex 标准库异常类(std::exception)系列,能满足大多数使用异常的场景,但对…

目录

1.自定义异常类spdlog_ex

1.1.通用异常

1.2.系统调用异常

1.3.what()函数

2.异常的使用

2.1.抛出异常

2.2.控制异常使用


1.自定义异常类spdlog_ex

标准库异常类(std::exception)系列,能满足大多数使用异常的场景,但对系统调用异常及错误信息缺乏支持。spdlog通过继承std::exception,扩展对系统调用的支持,实现自定义异常类spdlog_ex。

spdlog_ex类声明很简单,在std::exception基础上添加了string类型的msg_成员,提供支持errno的构造函数。

// include/spdlog/details/common.h// Log exception
class SPDLOG_API spdlog_ex : public std::exception
{
public:explicit spdlog_ex(std::string msg);spdlog_ex(const std::string &msg, int last_errno); // 提供系统调用错误号errno的支持const char *what() const SPDLOG_NOEXCEPT override;
private:std::string msg_; // 异常文本信息
};

1.1.通用异常

对于通用的异常,spdlog_ex并未做什么特别的事情,只是将用户传入的异常提示信息存放到msg_。

SPDLOG_INLINE spdlog_ex::spdlog_ex(std::string msg): msg_(std::move(msg))
{}

1.2.系统调用异常

spdlog_ex对errno的支持,主要是将errno转换为对应错误文本信息,存放到msg_字符串中。spdlog使用的是ftm库提供的format_system_error来完成转换工作,出于对memory_buf_t支持。当然,也可以使用C库函数strerror(或者线程安全版本strerror_r)。

SPDLOG_INLINE spdlog_ex::spdlog_ex(const std::string &msg, int last_errno)
{
#ifdef SPDLOG_USE_STD_FORMATmsg_ = std::system_error(std::error_code(last_errno, std::generic_category()),  msg).what();
#elsememory_buf_t outbuf;fmt::format_system_error(outbuf, last_errno, msg.c_str());msg_ = fmt::to_string(outbuf);
#endif
}

1.3.what()函数

what()是基类std::exception定义的virtual函数,用户通常通过该接口获取异常信息。spdlog_ex也是简单的返回存放异常信息的msg_。

SPDLOG_INLINE const char *spdlog_ex::what() const SPDLOG_NOEXCEPT
{return msg_.c_str();
}

2.异常的使用

2.1.抛出异常

前面是讲如何实现spdlog_ex,但如何在spdlog中抛出一个异常对象呢?直接调用throw spdlog_ex(..)?
spdlog提供了重载函数形式的接口:throw_spdlog_ex。

SPDLOG_INLINE void throw_spdlog_ex(const std::string &msg, int last_errno)
{SPDLOG_THROW(spdlog_ex(msg, last_errno));
}SPDLOG_INLINE void throw_spdlog_ex(std::string msg)
{SPDLOG_THROW(spdlog_ex(std::move(msg)));
}

throw_spdlog_ex本质上也是throw spdlog_ex(..),为何要通过一个宏定义SPDLOG_THROW来进行呢?
这就涉及到下面要讲的控制异常使用。

2.2.控制异常使用

有些APP并不希望第三方库抛出异常,而有些无所谓。为此,spdlog提供两种模式:抛出异常,不抛出异常,通过宏定义SPDLOG_NO_EXCEPTIONS来控制。
当没有定义宏SPDLOG_NO_EXCEPTIONS时,正常抛出异常对象;
当定义了宏SPDLOG_NO_EXCEPTIONS时,抛出异常替换为直接终止程序(abort)

#ifdef SPDLOG_NO_EXCEPTIONS
#    define SPDLOG_TRY
#    define SPDLOG_THROW(ex) \do \{ \printf("spdlog fatal error: %s\n", ex.what()); \std::abort(); \} while (0)
#    define SPDLOG_CATCH_STD
#else
#    define SPDLOG_TRY try
#    define SPDLOG_THROW(ex) throw(ex)
#    define SPDLOG_CATCH_STD \catch (const std::exception &) {}
#endif

通过这种方式,spdlog异常处理更加灵活,更好适配APP对是否抛出异常的需求。

因此,在spdlog中,捕获异常的代码块try-catch,看起来会是这样:

// message all threads to terminate gracefully join them
SPDLOG_INLINE thread_pool::~thread_pool()
{SPDLOG_TRY{for (size_t i = 0; i < threads_.size(); i++){post_async_msg_(async_msg(async_msg_type::terminate),  async_overflow_policy::block);}for (auto &t : threads_){t.join();}}SPDLOG_CATCH_STD
}

当然,也可以使用自定义捕获(catch)代码块,替换SPDLOG_CATCH_STD,看起来会是这样:

SPDLOG_INLINE void spdlog::async_logger::backend_flush_()
{for (auto &sink : sinks_){SPDLOG_TRY{sink->flush();}SPDLOG_LOGGER_CATCH(source_loc())}
}#ifndef SPDLOG_NO_EXCEPTIONS
#    define SPDLOG_LOGGER_CATCH(location) \catch (const std::exception &ex) \{ \if (location.filename) \{ \err_handler_(fmt_lib::format(SPDLOG_FMT_STRING("{} [{}({})]"),  ex.what(), location.filename, location.line)); \} \else \{ \err_handler_(ex.what()); \} \} \catch (...) \{ \err_handler_("Rethrowing unknown exception in logger"); \throw; \}
#else
#    define SPDLOG_LOGGER_CATCH(location)
#endif
http://www.hengruixuexiao.com/news/38765.html

相关文章:

  • 是不是做网站就能赚钱福州seo
  • 哪个网站专门做牛奶的seo百度快速排名
  • 网站上传文件不大于5M定么做快速建站教程
  • 做改网站公司推广方法有哪些
  • 重庆专业做网站武汉大学人民医院院长
  • wordpress主题详情更改版权宜昌网站seo
  • 丰涵网站建设哪里有软件培训班
  • 潍坊市做网站最新国际新闻50条简短
  • 青岛高端网站建设公司最近中国新闻热点大事件
  • 网站模版 蓝色海南seo代理加盟供应商
  • 做代加工的网站发布百度竞价推广投放
  • ubuntu 做网站 分区沈阳关键词优化费用
  • 建设公司起名哪个网站好如何去推广
  • 免费app制作软件下载seo博客网站
  • 中英文切换网站开发网站建站推广
  • 所有做网站公司广告公司职位
  • 税务网站建设 目标佛山网站建设正规公司
  • 石河子网站建设企业邮箱登录入口
  • 视频微网站开发seo网络优化公司
  • 网站做优化有必要吗友情链接免费发布平台
  • 惠州市住房和城乡规划建设局官方网站微信客户管理系统平台
  • 君和网站建设投诉百度最有效的电话
  • 网站安全事件应急处置机制建设搜索引擎优化方法总结
  • 帕兰映像 wordpress网站建设seo
  • 政府做网站要什么资质腾讯3大外包公司
  • jsp asp php哪个做网站企业网站的域名是该企业的
  • 互联网行业特点seo静态页源码
  • 开发网站的基本过程论坛营销
  • 买公司的网站建设网站设计案例
  • 做贸易常用的网站谷歌优化工具