预计将于 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 新功能:多重错误包装_天天速看
- 香港11月楼价按月跌3.3% 创近5年半新低
- 世界百事通!37岁宋仲基官宣新恋情!与英国女友现身机场,女方气质不输宋慧乔
- 协和电子(605258.SH)通过高新技术企业认定
- 环球热讯:做零食批发!你可以这样搞
- 新元科技(300472)12月26日主力资金净卖出45.47万元|全球消息
- 京东白条借款逾期33年还不起征信有什么影响_天天视点
- 惠城环保(300779)12月26日主力资金净买入25.27万元 当前看点
- 秦绪文:假如自媒体账号有10000粉丝,每天能赚多少?|环球新动态
- 易借速贷逾期多久才能上征信
- 快e贷逾期21天延迟还款会上征信吗|全球快播
- 宇通客车(600066)12月23日主力资金净卖出2981.46万元
- 恒基达鑫: 独立董事关于延长公司第一期员工持股计划存续期的独立意见|每日快看
- 【报资讯】恒银科技踩雷:3个月2起信托理财逾期,超1.8亿本金收益年内难收回?
- 【焦点热闻】全国碳市场累计成交额突破100亿元大关 交易主体有望从发电企业延伸向其他领域
- 焦点滚动:“阳了”以后浑身疼痛怎么办?专家教你这样缓解
- 焦点要闻:齐聚庐州,共绘未来,凯里亚德、郁锦香酒店亮相投资沙龙会
- 春节天猫年货供应“不打烊”|世界速讯
- 莎普爱思(603168.SH):陈德康、胡正国以集中竞价合计减持402.81万股 每日快看
- 黄山胶囊董秘回复:公司目前还不掌握相关情况
- 快看点丨万润科技: 关于会计估计变更的补充公告
- Free Arch: 将 IdentityServer 部署到 Okteto-环球今头条
- 京新药业(002020)12月19日主力资金净卖出1059.07万元
- 枣阳小镇法庭,守护群众司法权益 环球观速讯
- 焦点速递!12月19日普蕊斯跌5.65%,国投医保A基金重仓该股
- 石狮:洗车机台被盗 民警快速破案 全球短讯
- 天天微动态丨好的领域模型应该是什么样子?
- 各地推进老年人新冠病毒疫苗接种工作|前沿资讯
- “湾区新地标”广东顺德区德胜体育中心项目主体落成
- 博汇股份:12月8日公司高管尤丹红减持公司股份合计2000股|环球热讯
- 天奈科技跌5.98%,东吴证券一个月前给出“买入”评级,目标价157.00元 全球通讯
- 稀土让羽绒服自带“热循环”
- 世界微资讯!江苏新能:拟合资设立金云新能 开发建设渔光互补发电项目
- 环球精选!郏县:公益阅览室丰富孩子暑期生活
- 嘉曼服饰(301276)12月14日主力资金净买入338.87万元|世界微资讯
- 纬达光电北交所上市路演:打破了日本等地的市场垄断地位
- 今日报丨异动快报:曲江文旅(600706)12月14日13点51分触及涨停板
- 她是张嘉译前女友,爱上孙红雷却无疾而终,如今45岁嫁入豪门
- ST中捷董秘回复:公司将持续提高投资者关系管理维护工作
- 内蒙古全面推进生态、安全、能源、农畜、开放“五大任务”
- “天鹅宝宝”来了,温榆河公园首次监测到疣鼻天鹅
- 环球今日报丨涨停雷达:中医药个股异动 金安国纪触及涨停
- 网传辽宁一有轨电车碾压电动自行车 官方回应:系剐蹭、人无碍 天天热议
- 资讯:鲜虾粉丝煲
- 北方导航(600435):制导控制核心标的
- 天喻信息:目前没有数据脱敏等方面的业务-焦点热门
- 跨境支付概念股普遍上涨 南天信息、京北方涨停
- 昨天全球首架涂装北京环球度假区主题班机首度亮相大兴机场
- 最新消息!北京两大机场进出港旅客数量增长近一倍
- 北京轨道交通第三期建设规划公示 规划里程约231.3公里
- “天上一张网”越织越密!北京大兴机场迈入“双枢纽时代”
- 北京经开区首推“一张清单告知”800多个高频事项一键办理
- 全球ICT巨头齐聚服贸会元宇宙生态头部玩家将悉数亮相
- 城市绿心实现首个城市组团级区域绿色低碳能源全覆盖 实现“负碳”状态
- 茅台冰淇淋消息冲上热搜 引来网友热议“下一步是不是茅台奶茶店”
- 中科院青藏高原所建成雅鲁藏布江流域多圈层水文监测网
- 三江源腹地玛沁多措施保障黄河流域生态安全
- 浙江台州天台县集中隔离点发现2例阳性
- 天津中小学今日恢复线下教学
- 北京:社区周边市场供应充足,蔬菜水果十分新鲜
- 31省份累计报告接种新冠病毒疫苗333177.1万剂次
- 北京市昌平区两地实施管控措施
- 一季度北京降尘量同比下降超50% 将加强控制“二次扬尘”
- 疫情之下 研招“云复试”
- 每天两次送饭上门 免费社区团餐让900多位老人“吃好饭”
- 北京房山一褡裢火烧店已至少关联8名感染者 去过请立即报告
- 内蒙古自治区满洲里市所有居民开展第三轮区域核酸检测
- 北京昌平发现1名核酸检测阳性人员 行程轨迹公布
- 上海嘉定一单位厂房发生火灾 火势已被扑灭无人员伤亡
- 广福日记·8户11人丨最终记:10+1
- 北京:凌晨补货,量足价稳!昨晚超市空置的货架又被填满了
- 河南多地取消今年中招体育和理化生实验考试
- 大藤峡水利枢纽通过挡水验收 今年汛期将开启防洪运用
- 4月25日12时起 河南终止省级防汛Ⅳ级应急响应
- 续写春天的故事丨乌兰牧骑续新篇
- 海报丨坚守,在楼宇方舱
- 【挑战365天正能量速写画】第146期:90岁奶奶变“刘畊宏女孩”跟跳毽子操
- 吉林延吉四名外卖小哥一分钟救两命
- 上海市市场监管局:利用社区团购发“疫情财”,露头就打
- 新疆阿克苏地区沙雅县发生3.9级地震 震源深度10千米
- 这个春天,复旦园向阳而生,安然如斯
- 北京朝阳区部分区域提升管控措施 区域内居民足不出区
- 强降雨致严重积水 四川内江紧急转移被困人员
- 山西太原管控区里“蔬菜兄弟”的一天
- 北京家庭教育主题培育实践启动 发布“理想”主题童书书单
- (上海战疫录)一线丨凝“新”聚力 上海新阶层人士同心守“沪”
- 截至2021年底 全国累计报告职业性尘肺病患者91.5万人
- (上海战疫录)抓获34人!上海警方严厉打击伪造买卖涉疫通行证违法犯罪
- (上海战疫录)上海26日对封控、管控和防范区人员进行全员核酸筛查
- 快递小哥手握通行证,却做了志愿者:总有些东西,比钱更重要
- 湖南新增12例新冠肺炎确诊病例
- 外国人在上海:德国女摄影师的核酸日常
- “东北味”核酸检测贴纸“出圈” 网友:太接地气了!
- 烟台病例基因分型为奥密克戎BA.2.3进化分支 目前国内尚未发现
- 网友“刷量”赚取注册奖励 被判收益无效
- 超20万人次观看 广州小提琴家奏响战“疫”乐章
- 江苏南通崇川区:“志愿红”扛起抗疫担当
- 辽宁沈阳:加强景区流量控制 有序恢复堂食
- “越是困难的时候,越要与群众在一起”
- 天津一按摩店疫情期间擅自违规营业 经营者被行拘
精彩推荐
-
GO 1.20 新功能:多重错误包装_天天速看2022-12-28
-
香港11月楼价按月跌3.3% 创近5年半新低2022-12-28
-
世界百事通!37岁宋仲基官宣新恋情!与英国女友现身机场,女方气质不输宋慧乔2022-12-27
-
协和电子(605258.SH)通过高新技术企业认定2022-12-27
-
环球热讯:做零食批发!你可以这样搞2022-12-27
-
新元科技(300472)12月26日主力资金净卖出45.47万元|全球消息2022-12-27
-
京东白条借款逾期33年还不起征信有什么影响_天天视点2022-12-26
-
惠城环保(300779)12月26日主力资金净买入25.27万元 当前看点2022-12-26
-
秦绪文:假如自媒体账号有10000粉丝,每天能赚多少?|环球新动态2022-12-26
-
易借速贷逾期多久才能上征信2022-12-25
-
快e贷逾期21天延迟还款会上征信吗|全球快播2022-12-25
-
宇通客车(600066)12月23日主力资金净卖出2981.46万元2022-12-24
-
恒基达鑫: 独立董事关于延长公司第一期员工持股计划存续期的独立意见|每日快看2022-12-23
-
【报资讯】恒银科技踩雷:3个月2起信托理财逾期,超1.8亿本金收益年内难收回?2022-12-23
-
【焦点热闻】全国碳市场累计成交额突破100亿元大关 交易主体有望从发电企业延伸向其他领域2022-12-23
-
焦点滚动:“阳了”以后浑身疼痛怎么办?专家教你这样缓解2022-12-22
-
焦点要闻:齐聚庐州,共绘未来,凯里亚德、郁锦香酒店亮相投资沙龙会2022-12-22
-
春节天猫年货供应“不打烊”|世界速讯2022-12-22
-
黄山胶囊董秘回复:公司目前还不掌握相关情况2022-12-21
-
快看点丨万润科技: 关于会计估计变更的补充公告2022-12-21
-
Free Arch: 将 IdentityServer 部署到 Okteto-环球今头条2022-12-20
-
京新药业(002020)12月19日主力资金净卖出1059.07万元2022-12-20
-
枣阳小镇法庭,守护群众司法权益 环球观速讯2022-12-19
-
焦点速递!12月19日普蕊斯跌5.65%,国投医保A基金重仓该股2022-12-19
-
石狮:洗车机台被盗 民警快速破案 全球短讯2022-12-19
-
天天微动态丨好的领域模型应该是什么样子?2022-12-18
-
各地推进老年人新冠病毒疫苗接种工作|前沿资讯2022-12-18
-
“湾区新地标”广东顺德区德胜体育中心项目主体落成2022-12-17
-
博汇股份:12月8日公司高管尤丹红减持公司股份合计2000股|环球热讯2022-12-16
-
天奈科技跌5.98%,东吴证券一个月前给出“买入”评级,目标价157.00元 全球通讯2022-12-16
-
稀土让羽绒服自带“热循环”2022-12-16
-
世界微资讯!江苏新能:拟合资设立金云新能 开发建设渔光互补发电项目2022-12-15
-
环球精选!郏县:公益阅览室丰富孩子暑期生活2022-12-15
-
嘉曼服饰(301276)12月14日主力资金净买入338.87万元|世界微资讯2022-12-15
-
纬达光电北交所上市路演:打破了日本等地的市场垄断地位2022-12-14
-
今日报丨异动快报:曲江文旅(600706)12月14日13点51分触及涨停板2022-12-14
-
她是张嘉译前女友,爱上孙红雷却无疾而终,如今45岁嫁入豪门2022-12-14
-
ST中捷董秘回复:公司将持续提高投资者关系管理维护工作2022-12-13
-
内蒙古全面推进生态、安全、能源、农畜、开放“五大任务”2022-12-13
-
“天鹅宝宝”来了,温榆河公园首次监测到疣鼻天鹅2022-12-12
-
环球今日报丨涨停雷达:中医药个股异动 金安国纪触及涨停2022-12-12
-
网传辽宁一有轨电车碾压电动自行车 官方回应:系剐蹭、人无碍 天天热议2022-12-10
-
资讯:鲜虾粉丝煲2022-12-09
-
北方导航(600435):制导控制核心标的2022-12-07
-
天喻信息:目前没有数据脱敏等方面的业务-焦点热门2022-12-06
-
跨境支付概念股普遍上涨 南天信息、京北方涨停2022-09-15
-
昨天全球首架涂装北京环球度假区主题班机首度亮相大兴机场2022-07-09
-
最新消息!北京两大机场进出港旅客数量增长近一倍2022-07-09
-
北京轨道交通第三期建设规划公示 规划里程约231.3公里2022-07-09
-
“天上一张网”越织越密!北京大兴机场迈入“双枢纽时代”2022-07-09
-
北京经开区首推“一张清单告知”800多个高频事项一键办理2022-07-09
-
全球ICT巨头齐聚服贸会元宇宙生态头部玩家将悉数亮相2022-07-09
-
城市绿心实现首个城市组团级区域绿色低碳能源全覆盖 实现“负碳”状态2022-07-09
-
茅台冰淇淋消息冲上热搜 引来网友热议“下一步是不是茅台奶茶店”2022-05-20
-
中科院青藏高原所建成雅鲁藏布江流域多圈层水文监测网2022-04-25
-
三江源腹地玛沁多措施保障黄河流域生态安全2022-04-25
-
浙江台州天台县集中隔离点发现2例阳性2022-04-25
-
天津中小学今日恢复线下教学2022-04-25
-
北京:社区周边市场供应充足,蔬菜水果十分新鲜2022-04-25
-
31省份累计报告接种新冠病毒疫苗333177.1万剂次2022-04-25
-
北京市昌平区两地实施管控措施2022-04-25
-
一季度北京降尘量同比下降超50% 将加强控制“二次扬尘”2022-04-25
-
疫情之下 研招“云复试”2022-04-25
-
每天两次送饭上门 免费社区团餐让900多位老人“吃好饭”2022-04-25
-
北京房山一褡裢火烧店已至少关联8名感染者 去过请立即报告2022-04-25
-
内蒙古自治区满洲里市所有居民开展第三轮区域核酸检测2022-04-25
-
北京昌平发现1名核酸检测阳性人员 行程轨迹公布2022-04-25
-
上海嘉定一单位厂房发生火灾 火势已被扑灭无人员伤亡2022-04-25
-
广福日记·8户11人丨最终记:10+12022-04-25
-
北京:凌晨补货,量足价稳!昨晚超市空置的货架又被填满了2022-04-25
-
河南多地取消今年中招体育和理化生实验考试2022-04-25
-
大藤峡水利枢纽通过挡水验收 今年汛期将开启防洪运用2022-04-25
-
4月25日12时起 河南终止省级防汛Ⅳ级应急响应2022-04-25
-
续写春天的故事丨乌兰牧骑续新篇2022-04-25
-
海报丨坚守,在楼宇方舱2022-04-25
-
【挑战365天正能量速写画】第146期:90岁奶奶变“刘畊宏女孩”跟跳毽子操2022-04-25
-
吉林延吉四名外卖小哥一分钟救两命2022-04-25
-
上海市市场监管局:利用社区团购发“疫情财”,露头就打2022-04-25
-
新疆阿克苏地区沙雅县发生3.9级地震 震源深度10千米2022-04-25
-
这个春天,复旦园向阳而生,安然如斯2022-04-25
-
北京朝阳区部分区域提升管控措施 区域内居民足不出区2022-04-25
-
强降雨致严重积水 四川内江紧急转移被困人员2022-04-25
-
山西太原管控区里“蔬菜兄弟”的一天2022-04-25
-
北京家庭教育主题培育实践启动 发布“理想”主题童书书单2022-04-25
-
(上海战疫录)一线丨凝“新”聚力 上海新阶层人士同心守“沪”2022-04-25
-
截至2021年底 全国累计报告职业性尘肺病患者91.5万人2022-04-25
-
(上海战疫录)抓获34人!上海警方严厉打击伪造买卖涉疫通行证违法犯罪2022-04-25
-
(上海战疫录)上海26日对封控、管控和防范区人员进行全员核酸筛查2022-04-25
-
快递小哥手握通行证,却做了志愿者:总有些东西,比钱更重要2022-04-25
-
湖南新增12例新冠肺炎确诊病例2022-04-25
-
外国人在上海:德国女摄影师的核酸日常2022-04-25
-
“东北味”核酸检测贴纸“出圈” 网友:太接地气了!2022-04-25
-
烟台病例基因分型为奥密克戎BA.2.3进化分支 目前国内尚未发现2022-04-25
-
网友“刷量”赚取注册奖励 被判收益无效2022-04-25
-
超20万人次观看 广州小提琴家奏响战“疫”乐章2022-04-25
-
江苏南通崇川区:“志愿红”扛起抗疫担当2022-04-25
-
辽宁沈阳:加强景区流量控制 有序恢复堂食2022-04-25
-
“越是困难的时候,越要与群众在一起”2022-04-25
-
天津一按摩店疫情期间擅自违规营业 经营者被行拘2022-04-25