首页 > 财经 > > 内容页

GO 1.20 新功能:多重错误包装

2022-12-27 14:30:40

预计将于 2023 年 2 月发布的 Go 1.20 有一个小的变化,对于那些大量使用错误包装的应用程序来说,可能会有效改进它们的错误处理方法。

让我们看一下它的用法,但首先,需要简要回顾一下什么是错误包装。如果你已经掌握了可以直接跳到下面的 “Go 1.20 新功能” 部分以获取新的信息。

Go 中的错误是实现一个非常简单的接口:


(相关资料图)

typeerrorinterface{Error()string}

错误类型可以是任何东西,从string本身到int,但通常它们是struct类型。下面这个例子来自标准库:

typeerrstruct{sstring}func(e*err)Error()string{returne.s}

要检查 Go 中的错误,你只需比较一个值(在本例中为int值):

iferr==io.EOF{//...}

第二种常见的用法是检查错误的类型,那也意味着要写更多的代码:

ifnerr,ok:=err.(net.Error){//...(usenerrwhichisanet.Error)}

在上面的例子中,类型断言测试类型net.Error的err值,并创建一个新变量nerr,它可以在 if 语句中使用。Go 中的错误方便理解、易于使用且非常高效。

错误包装

从 Go 1.13 开始,引入了错误包装。包装允许将错误嵌入到其他错误中,就像在其他语言中包装异常一样。这非常实用,比如函数遇到 “record not found” 错误时,可以向错误信息中添加更多上下文信息,例如 “unknown user: record not found”。

Go 中错误包装设计背后的有趣想法是:契约不用关心错误类型、结构或它们是如何创建的。而唯一关注的是解包过程和转换为字符串,因为这两者是必须的。这就非常容易实现:支持解包的错误类型必须实现Unwrap() error方法。

标准库中没有(命名的)接口可以向您展示,因为接口是隐式实现的,没有必要单独写一个。这里我们写一个只是为了更好说明这篇文章:

typeWrappedErrorinterface{Unwrap()error}

我们来看看 Go 标准库(实际上是 package fmt)中是如何实现包装错误的:

typewrapErrorstruct{msgstringerrerror}func(e*wrapError)Error()string{returne.msg}func(e*wrapError)Unwrap()error{returne.err}

由于上面错误类型实现了Error() string方法,所以说 Go 中的错误实际上最终是字符串并没有错,因此需要一种创建这些字符串的良好机制。这就是标准库中的函数fmt.Errorf发挥作用的地方:

varRecordNotFoundErr=errors.New("notfound")constname,id="lzap",13werr:=fmt.Errorf("unknownuser%q(id%d):%w",name,id,recordNotFoundErr)fmt.Println(werr.Error())

一个特殊格式的动词%w,每次调用只能使用一次(稍后会详细介绍),用于错误参数。除此之外,该函数的工作方式类似于fmt.Printf函数。下面的例子打印了这个结果:

unknownuser"lzap"(id13):notfound

如你所见,错误包装本质上是一个链表。要解包错误,请使用errors.Unwrap函数,该函数将为链表中的最后一个错误值返回nil。要检查错误类型或值,需要遍历整个列表,这对于需要进行频繁的错误检查不太实用。幸运的是,有两个辅助函数可以做到这一点。

检查包装错误列表中的值:

iferrors.Is(err,RecordNotFoundErr){//...}

检查特定类型(下面例子是来自标准库的网络错误):

varnerr*net.Erroriferrors.As(err,&nerr){//...(usenerrwhichisa*net.Error)}

以上总结了 Go 1.13 及更高版本中的错误包装。

Go 1.20 新特性

让我们看看 Go 1.20 中真正的新功能,从函数errors.Join开始,它通过可变参数包装错误列表:

err1:=errors.New("err1")err2:=errors.New("err2")err:=errors.Join(err1,err2)fmt.Println(err)

当事先不知道错误数量时,此功能可用于将错误连接在一起。一个很好的例子是从 goroutines 收集错误。值得一提的是,该函数将列表中的错误与换行符连接起来。上面的代码片段打印:

err1err2

对于许多应用程序或(日志记录)库来说,这可能会存在问题,它们期望错误通常只是没有换行符的字符串。幸运的是,Go 1.20 中的另一个变化改变了fmt.Errorf的行为:该函数现在接受多个%w格式说明符:

err1:=errors.New("err1")err2:=errors.New("err2")err:=fmt.Errorf("%w+%w",err1,err2)fmt.Println(err)

以前会导致格式错误的格式字符串现在可以正确打印:

err1+err2

同时包装多个错误实现Unwrap() error,这是可能的吗?

事实证明,在 Go 1.20 标准库中有一种新的机制: 实现Unwrap() []error函数的错误类型可以包装多个错误。让我们来看看这是如何在库中实现的:

typejoinErrorstruct{errs[]error}func(e*joinError)Error()string{//concatenateerrorswithanewlinecharacter}func(e*joinError)Unwrap()[]error{returne.errs}

一个理论上的接口,但标准库中实际不存在,如下所示:

typeMultiWrappedErrorinterface{Unwrap()[]error}

由于 Go 不允许方法重载,因此每种类型都可以实现Unwrap() error或Unwrap() []error,但不能同时实现。还记得我提到过包装错误本质上是一个链表吗?实现前一个(新引入的)方法的类型实际上形成了一个链接树,函数errors.Is和errors.As的工作方式相同,只是现在它们需要遍历树而不是列表。根据文档,该实现执行预排序、深度优先遍历。

这确实是 Go 1.20 带来的全部,它可能看起来是一个小的变化,但它提供了如何有效和干净地处理错误的新方法。在展示真实示例之前,让我总结一下新功能:

新的Unwrap []error函数契约允许遍历错误树。

新的errors.Join函数,这是一个方便的函数,用于连接两个错误字符串值(使用换行符)。

现有函数errors.Is和errors.As已更新,可以同时处理错误列表和错误树。

现有函数fmt.Errorf现在接受多个%w格式动词。实践

上面这一切都很棒,但是你如何在实践中利用它呢?

在一个小型 REST API 微服务中,我们通过errors.New和fmt.Errorf处理来自 DAO 包(数据库)、REST 客户端(其他后端服务)和其他包的各种错误。返回的 HTTP 状态代码应该是 2xx、4xx 或 5xx,具体取决于错误状态以遵循最佳 REST API 实践。实现此过程的一种方法是解开主 HTTP 处理程序中的错误并找出它是哪种错误。

然而,通过多重错误包装,现在可以包装根本原因(例如数据库返回 “no records found” )和返回给用户 HTTP 代码(在本例中为 404)。

一个工作示例如下所示:

packagemainimport("errors""fmt")//commonHTTPstatuscodesvarNotFoundHTTPCode=errors.New("404")varUnauthorizedHTTPCode=errors.New("401")//databaseerrorsvarRecordNotFoundErr=errors.New("DB:recordnotfound")varAffectedRecordsMismatchErr=errors.New("DB:affectedrecordsmismatch")//HTTPclienterrorsvarResourceNotFoundErr=errors.New("HTTPclient:resourcenotfound")varResourceUnauthorizedErr=errors.New("HTTPclient:unauthorized")//applicationerrors(thenewfeature)varUserNotFoundErr=fmt.Errorf("usernotfound:%w(%w)",RecordNotFoundErr,NotFoundHTTPCode)varOtherResourceUnauthorizedErr=fmt.Errorf("unauthorizedcall:%w(%w)",ResourceUnauthorizedErr,UnauthorizedHTTPCode)funchandleError(errerror){iferrors.Is(err,NotFoundHTTPCode){fmt.Println("Willreturn404")}elseiferrors.Is(err,UnauthorizedHTTPCode){fmt.Println("Willreturn401")}else{fmt.Println("Willreturn500")}fmt.Println(err.Error())}funcmain(){handleError(UserNotFoundErr)handleError(OtherResourceUnauthorizedErr)}

这将打印:

Willreturn404usernotfound:DB:recordnotfound(404)Willreturn401unauthorizedtocallotherservice:HTTPclient:unauthorized(401)

从这样的人工代码片段中可能看起来不太明显的是,实际上的错误声明通常分布在许多包中,并且不容易跟踪所有可能的错误以确保所需的 HTTP 状态代码。在这种方法中,所有在一个地方声明的应用程序级包装错误也包含了 HTTP 代码。

请注意,这在 Go 1.19 或更早版本中是不可能的,因为fmt.Errorf函数只会包装第一个错误。该代码确实在 1.19 上可以编译,甚至不会产生运行时恐慌,但它实际上不会工作。

显然,常见的 HTTP 状态代码很容易成为一种新的错误类型(基于int类型),因此可以通过errors.As轻松提取实际代码,但我想让示例保持简单。

Feel free to play around with the code on Go Playground. Make sure to use “dev branch” or 1.20+ version of Go. 可以在 Go Playground 上自由运行上述代码。确保使用 “dev branch” 或 Go 的 1.20+ 版本。现有应用

在你的应用程序中实施新功能时,请注意errors.Unwrap函数。对于具有Unwrap() []error的错误类型,它总是返回nil:

err1:=errors.New("err1")err2:=errors.New("err2")err:=errors.Join(err1,err2)unwrapped:=errors.Unwrap(err)fmt.Println(unwrapped)

由于 Go 1.X 兼容性承诺,这会打印出 “nil”。当你引入多个包装错误时,请确保检查展开代码。幸运的是,典型 Go 代码中的大部分错误检查都是使用errors.Is和errors.As完成的。

错误包装并不是 Go 中所有错误处理的最终解决方案。它只是提供了一种干净的方法来处理典型 Go 应用程序中的错误,对于简单应用程序来说也许就完全足够了。原文地址:https://lukas.zapletalovi.com/posts/2022/wrapping-multiple-errors/原文作者:Lukáš Zapletal本文永久链接:https://github.com/gocn/translator/blob/master/2022/w50_Wrapping_multiple_errors译者:haoheipi

校对:watermelo

往期推荐

谷歌发布查找开源漏洞的Go工具OSV-Scanner

最好的Go框架:没有框架?

「每周译Go」如何在Go中构造For 循环

想要了解Go更多内容,欢迎扫描下方关注公众号,回复关键词 [实战群],就有机会进群和我们进行交流

分享、在看与点赞Go

x 广告
最近更新

GO 1.20 新功能:多重错误包装

2022-12-27

天保基建:12月26日获融资买入1353.95万元,占当日流入资金比例14.42%_世界要闻

2022-12-27

超频三: 关于以简易程序向特定对象发行股票限售股份上市流通的提示性公告|微动态

2022-12-26

焦点信息:27岁冰壶运动员王一博因患中枢淋巴瘤离世,曾多次获得全国冠军

2022-12-26

恢复正常!今天早高峰,4号线大兴线最小发车间隔2分钟

2022-12-26

美联储利率明年见顶?

2022-12-25

贷款逾期13个月会征信怎么样 即时焦点

2022-12-25

天天头条:国产强强联合 兆芯正式加入deepin开源社区

2022-12-24

全球新消息丨离婚时赡养费的标准是什么啊

2022-12-23

当前视讯!东北证券董秘回复:宏图高科预重整工作尚在进行阶段,公司将积极关注,争取最大程度保障合法权益

2022-12-23

焦点资讯:广东阳江一码头多艘渔船着火,官方:无人员伤亡

2022-12-23

傲农生物: 福建傲农生物科技集团股份有限公司股权激励限制性股票回购注销实施公告

2022-12-22

一款强大的API接口文档管理工具 全球最新

2022-12-22

全球视点!汇聚各方力量 守护儿童成长(有温度的举措 暖民心的行动)

2022-12-22

世界最新:国家邮政局:1-11月邮政行业寄递业务量累计完成1263.1亿件

2022-12-21

3小时!开发ChatGPT微信小程序 焦点快报

2022-12-21

G338线盘坡至热水段改建公路建成通车-观焦点

2022-12-21

【新时代新征程新伟业】江西信丰田垅畲族村:产业+旅游带动乡村蝶变 热资讯

2022-12-20

红魔 8 Pro 系列将于 12 月 26 日发布 今日快讯

2022-12-20

环球今热点:孙明春:SG投资面临的九大挑战︱明言ESG

2022-12-19

通宇通讯:乌克兰是公司重要区域市场,俄乌战争对公司今年欧洲市场收入影响较大

2022-12-19

首创环保于烟台投资水务公司,注册资本1.95亿

2022-12-19

许昌市建安区:蹄疾步稳巩固脱贫成果-天天看点

2022-12-19

本西至少缺席三场比赛 养伤期篮网对他提出要求|当前简讯

2022-12-18

环球速讯:囤药一次没吃全过期上热搜!药师支招如何管好“家庭小药箱”

2022-12-17

Vicor Cool-Power ZVS DC-DC 转换器 焦点关注

2022-12-16

【独家焦点】本周盘点(12.12-12.16):济川药业周跌3.13%,主力资金合计净流入9348.20万元

2022-12-16

全球时讯:豫能控股:12月15日获融资买入200.74万元

2022-12-16

舆情追踪|益阳市大通湖金泰服装店新增严重违法信息-全球快播报

2022-12-15

如通股份(603036)12月15日主力资金净买入1301.00万元 全球速看

2022-12-15

人民币兑美元中间价报6.9343,调升192个基点

2022-12-15

航天电子董事长任德民辞职2022年前三季度公司净利5.05亿-天天动态

2022-12-14

世界今日讯!定期会商 破解难题 服务实体

2022-12-14

伟思医疗(688580)12月13日主力资金净卖出329.91万元

2022-12-14

银行理财年末又遭滑铁卢-每日速看

2022-12-13

精选!聚飞光电:12月12日融券卖出金额4.75万元,占当日流出金额的0.2%

2022-12-13

塔牌集团: 外部董事管理制度

2022-12-12

天天亮点!“跨界”的儿童厨具安全吗

2022-12-12

大牌云集上海南京西路商圈 “首发经济”助力高质量发展 资讯

2022-12-11

兴齐眼药(300573)12月8日主力资金净买入9175.16万元|世界播资讯

2022-12-09

天天热文:新股消息 | 国内职业教育培训商粉笔通过港交所聆讯 上半年营业收入达14.51亿元

2022-12-08

股票行情快报:博众精工(688097)12月6日主力资金净买入81.07万元|全球即时

2022-12-06

耐科装备二闯IPO 与A股公司文一科技关系匪浅

2022-07-18

秦皇岛市总探索新就业形态劳动者建会入会新路径

2022-03-18

国家卫健委:家庭医生签约服务“最后一公里”有望打通

2022-03-18

截至2021年底 全国乘用车产能利用率仅为52.47%

2022-03-18

教培机构如何合理处理与员工的劳动关系?

2022-03-18

夫妻二人用工业硫磺熏制竹笋 查获20余吨

2022-03-18

虚假宣传等老问题占比较大 车主权益如何保障?

2022-03-18

有人不解,有人转型……多地发布建筑业清退令

2022-03-18

避坑越来越难?安心消费呼唤监管亮出科技之剑

2022-03-18

政策春风“吹暖”市场预期 A股港股双双走强

2022-03-18

用人单位用“盲盒岗位”招聘引发公众热议

2022-03-18

金稳委重磅发声 共同维护资本市场稳定发展

2022-03-18

三部门: 加快推动城市货运配送体系 绿色低碳发展

2022-03-18

露天滑雪场运动员怎么上厕所?马桶藏着黑科技

2022-02-15

安徽16岁弟弟捐献造血干细胞救24岁哥哥

2022-02-15

广州一大型商场因疫情防控需求暂时封闭

2022-02-15

江苏苏州一地调整为中风险地区

2022-02-15

辽宁调派移动方舱检测车10台、496人支援葫芦岛疫情防控

2022-02-15

【新春走基层】田坎上来了乡村振兴工作队

2022-02-15

七旬养猪老汉系外省命案逃犯 持刀杀人潜逃13年后宿迁落网

2022-02-15

驻哈中企员工的“别样团圆”

2022-02-15

1月中国各种自然灾害造成42.2万人次受灾

2022-02-15

中国空间站、首次火星探测等入选2021年度十大科普事件

2022-02-15

广西百色疫情社区传播链基本阻断 社会面基本实现清零

2022-02-15

上海:禁止企业采用“最严算法”考核、遏制“以罚代管”

2022-02-15

上班时间向招聘网站投简历被裁 媒体:职场数字化管理别

2022-02-15

甘肃高校数百名大学生“云支教” “打卡”互动零距离育人

2022-02-15

广西百色:社会面基本清零 健康码转码工作有序开展

2022-02-15

广西贺州“碰瓷女王”重操旧业 再度入狱

2022-02-15

外卖小哥热汤圆吃出幸福感 生活不易愿被社会温柔以待

2022-02-15

冬奥邂逅元宵:外籍主播侨乡浙江文成“闹元宵”

2022-02-15

青岛检察机关开展学生安全保护专项监督活动

2022-02-15

等待两年,只为8分钟的相见

2022-02-15

运用数字技术打造劳模工匠服务管理新模式

2022-02-15

预制菜“大热”元宵餐桌 中国 “Z世代”成掌勺主力

2022-02-15

辽宁推进法院审级职能定位改革

2022-02-15

杭州西湖景区旅游法庭揭牌

2022-02-15

拓展乡村振兴的数字蓝海

2022-02-15

山东泰安:提升执法司法质效 让执法监督长出“牙齿”

2022-02-15

农机助力 种地省心

2022-02-15

监狱人民警察用言行诠释忠诚

2022-02-15

扎根中国大地 办出中国特色 争创世界一流

2022-02-15

守护海陀之巅 走近国内第一支专业高山救援队

2022-02-15

内蒙古满洲里:2月1日以来到过满洲里人员全部落实管控措施

2022-02-15

“0蔗糖”就是无糖、不渴不用喝水等谣言入选2021年度十大

2022-02-15

广西:监督推动乡村振兴政策项目资金落地见效

2022-02-15

把算法开关交给消费者 以保障消费者权益

2022-02-15

二七厂蝶变:科技自立自强

2022-02-15

从货担郎到日售数千斤 兰州手艺人40余载“滚”元宵留年

2022-02-15

大陆学生在台度春节:不一样的年味与团圆

2022-02-15

广东惠州全市全部封控管控解除

2022-02-15

为人民健康提供可靠保障

2022-02-15

青海藏族女孩小拉毛春节“重生记”

2022-02-15

让群众遇事不烦办事不难

2022-02-15

河南晒出2021年交通“成绩单”:村村通、户户通 农村公

2022-02-15

芥末味、芽菜臊子味……“怪味”汤圆求上桌,你会相中谁

2022-02-15

山东青岛:楼宇经济体劳动争议预防调解联盟成立

2022-02-15

电力巡线工“偏向虎山行”

2022-02-15

身边小商铺 连着千万家

2022-02-15

听!城市的脉动

2022-02-15

每一度温暖的背后

2022-02-15

一男子地铁站晕倒休克 路过女护士出手相救

2022-02-15

河南中小学将迎开学季 多地要求返校师生须核酸检测

2022-02-15

安徽新增1例无症状感染者 系境外输入

2022-02-15

冰墩墩设计者给北京四中学生回信:祝福可爱奋进的中国少

2022-02-15

江苏南通发现1人检测结果呈阳性 系外地返通人员

2022-02-15

湖南郴州报告2例香港返湘人员新冠肺炎确诊病例

2022-02-15

广西百色疫情社区传播链基本阻断

2022-02-15

广西新增1例本土确诊病例 本轮本土疫情累计报告确诊病例

2022-02-15

葫芦岛市两医院不再收治非绥中地区患者 就医患者闭环管理

2022-02-15

苏州14日新增本土确诊1例,无症状感染者3例 详情及轨迹公布

2022-02-15

2021年北京空气质量创历史最优 首次全面达标

2022-02-15

化屋村火起来了

2022-02-15

质量问题、精装修变“惊装修”......买房坑有多深?

2022-02-15

心安之处便是“家”——深圳水尾村见闻

2022-02-15

江苏发现一处面积约1475平方米唐代建筑基址

2022-02-15

青海共和县:发电放牧两相宜

2022-02-15

应急管理部:截至1月底查出烟花爆竹问题隐患28052项

2022-02-15

福建蕉城:古建筑里古韵悠长 琴筝齐鸣庆元宵

2022-02-15

单日新增28例 辽宁省葫芦岛市本轮疫情累计确诊89例

2022-02-15

一言不合放火烧家 任性女子被判刑

2022-02-15

新疆阿克苏地区库车市发生3.4级地震 震源深度7千米

2022-02-15

应急管理部:1月全国接报生产安全事故死亡超1100人

2022-02-15

畲乡少年小雷的团圆年

2022-02-15

心安之处便是“家”——深圳水尾村见闻

2022-02-15

江苏发现一处面积约1475平方米唐代建筑基址

2022-02-15

青海共和县:发电放牧两相宜

2022-02-15

应急管理部:截至1月底查出烟花爆竹问题隐患28052项

2022-02-15

福建蕉城:古建筑里古韵悠长 琴筝齐鸣庆元宵

2022-02-15

单日新增28例 辽宁省葫芦岛市本轮疫情累计确诊89例

2022-02-15

一言不合放火烧家 任性女子被判刑

2022-02-15

新疆阿克苏地区库车市发生3.4级地震 震源深度7千米

2022-02-15

应急管理部:1月全国接报生产安全事故死亡超1100人

2022-02-15

江苏省省长:苏州市要把疫情防控作为头等大事、第一要务

2022-02-15

广西新增确诊病例降至1例 百色市有序解除管控

2022-02-15

江苏:采取更加坚决果断措施迅速打赢苏州疫情防控战

2022-02-15

深圳调整跨境货车内地接驳司机核酸检测为每日一检

2022-02-15

绥芬河市15日起全域转为低风险地区

2022-02-15

黑龙江省新增境外输入确诊病例1例

2022-02-15

黑龙江绥芬河市全域调整为低风险地区

2022-02-15

广西百色疫情外溢风险已得到有效控制 社区传播基本阻断

2022-02-15

多名和尚尼姑聚餐并分钱?五台山佛协:非本地僧众 已报警

2022-02-15

江苏新增本土确诊8例、本土无症状感染者4例 均在苏州

2022-02-15

甘肃“真金白银”助中小微企业稳岗扩岗

2022-02-15

满洲里发现5例核酸阳性人员 所有居民开展全员核酸检测

2022-02-15

广西新增本土确诊病例1例 百色市报告

2022-02-15

辽宁省新增18例本土确诊病例 其中葫芦岛市报告17例

2022-02-15

广东新增本土确诊病例2例 为深圳市报告

2022-02-15

吉林黑龙江新疆等地仍有降雪 中东部将再有大范围雨雪

2022-02-15

元宵节北京多云山区有零星小雪 最高气温仅零下1℃

2022-02-15

广西靖西市两地调整为中风险地区

2022-02-15

苏州市多地调整为中风险地区

2022-02-15

云南2月14日新增无症状感染者6例

2022-02-15

实体书店为什么接二连三遭遇危机?生存之道在哪

2022-02-15

卜卦、占星、看手相…… 为什么有的年轻人总想算一卦

2022-02-15

开学倒计时 如何帮助孩子克服“开学综合征”

2022-02-15

十赌十输,为何还有人铤而走险?

2022-02-15

网络赌博花样百出难逃警方天罗地网

2022-02-15

上海“最严动迁”迁出最暖“母子情”的背后

2022-02-15

《狙击手》原型邹习祥:比电影更传奇的“冷枪英雄”

2022-02-15

苏州市多地调整为中风险地区

2022-02-15

打造“无废城市”,深圳的固体废物都去哪了?

2022-02-15

北京冬奥会开幕式滑雪萌宝:在旅途中烂漫长大

2022-02-15

快判冰墩墩盗版案,用法治为冬奥护航

2022-02-15

“雪道的尽头是骨科”?不必夸大冰雪运动的风险

2022-02-15

疫情外溢风险有效控制 广西百色局部解封

2022-02-15

“萌妹子班组”深夜守护中老铁路“绿巨人大脑”

2022-02-15

知乎否认安装和使用过“行为感知系统”

2022-02-15

福建漳州一货车撞人 致3死9伤

2022-02-15

深圳新增2例本土确诊病例 为入境旅客隔离酒店工作人员

2022-02-15

广西百色宣布解除“不进不出”管控措施

2022-02-15

2月15日零时起 苏州市关闭15个高速公路入口

2022-02-15

“95后”羌族货运员的春运:为中欧班列尽一份力

2022-02-15

养牛场里的“春节时光”

2022-02-15

赏非遗、玩游戏、看展演、触彩蛋......广府元宇宙首亮相

2022-02-15

松山湖隧道内的“青春舞者”

2022-02-15

消费者购买预售商品房权益受侵害问题突出

2022-02-15

铁道部退票最新通知:旅客列车车票免费退票

2022-02-15

浙江农民大学生的“共富经”:打造“瓜果王国” 年产值

2022-02-15

踏雪闹元宵 北京市属公园推出14项元宵节文化活动

2022-02-15

北京冬奥会张家口赛区公交调度员是怎样工作的?

2022-02-15

铁路人的春运时刻:在列车里过年 在站台上过节

2022-02-15

福州长乐机场海关连续查获人体胎盘素注射液400支

2022-02-15

山西民间艺人巧手剪纸贺元宵 盼传承传统技艺

2022-02-15

京津冀迎强降雪天气 交通运输部门护航平安春运

2022-02-15

纸短情长!来自北京冬奥会志愿者的一封家书

2022-02-15

看皮影、写春联、扭秧歌:内蒙古小镇年味浓

2022-02-15

山西小城一名下岗职工的人生逆袭:“弹棉花”弹出千万身

2022-02-15

开学首日 广东多地海事部门贴心护航“学生渡”

2022-02-15

福州:弘扬福文化 传承好家风

2022-02-15

长春七旬“国旗奶奶”带领居民升旗十年

2022-02-15

云南麻栗坡县新增病例均为集中隔离点发现

2022-02-15

云南临沧:“双警”家庭为爱守边

2022-02-15

深圳口岸又检测出12名跨境货车司机核酸阳性

2022-02-15

辽宁疫情持续一周 本土确诊连续五天超10例

2022-02-15

琼浙一对珍稀长臂猿情人节喜结良“猿”

2022-02-15

苏州新增8例新冠病毒阳性感染者 病毒溯源为奥密克戎变异株

2022-02-15

辽宁葫芦岛市成立74个监督检查组 发现并纠正问题71个

2022-02-15