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

做网站的关键技术专门做排行榜的软件

做网站的关键技术,专门做排行榜的软件,怎么做赌球网站,外贸业务员如何开发客户目录 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.hkea.cn/news/722031/

相关文章:

  • 网站开发不用框架web网站设计
  • 技能网站建设项目需求武汉网络推广外包公司
  • 安卓市场下载手机版优化网站排名技巧
  • 建设网站平台哪个好互联网营销外包推广
  • 工商注册企业名称查询广东seo网站推广代运营
  • 中纪委网站两学一做征文资源平台
  • java高端网站建设现在广告行业好做吗
  • wordpress 制作下载优化关键词怎么做
  • 宁波网站建设哪个公司好百度爱采购推广怎么入驻
  • 重庆市建设工程信息网特种作业企业网站seo多少钱
  • 域名备案做电影网站制作免费个人网站
  • 公司网络营销方案优化设计七年级上册数学答案
  • 网站建设策划方案网址搜索引擎
  • 艺术培训学校系统网站怎么做百度优化是什么
  • 自己的网站做飘窗百度推广账号登录入口
  • 国内好的网站建设国内外十大免费crm软件推荐
  • 淄博品质网站建设百度销售推广
  • 网站建设学习内容网站模板哪家好
  • 建立b2b网站成本微信营销平台系统
  • 学做衣服网 缤纷网站手机百度ai入口
  • 点餐系统网站建设画质优化app下载
  • 上海都有哪些企业公司seo网站seo
  • 进一步加强政府网站建设网站建设介绍ppt
  • 做网站的设计软件上海seo推广外包
  • 中国工程局人才招聘网福建seo推广方案
  • 深圳南山做网站的公司百度投诉中心
  • 辽宁建设工程信息网业绩认定武汉网站优化公司
  • 莱芜都市人才网上海网站seo公司
  • 广州做鞋的网站怎么让某个关键词排名上去
  • 温州平阳县网站建设兼职东莞网络推广哪家公司奿