上海 [ 更换 ]
热门城市
北京上海广州深圳成都杭州南京武汉天津西安重庆青岛沈阳长沙大连厦门无锡福州济南宁波昆明苏州郑州长春合肥南昌哈尔滨常州烟台南宁温州石家庄太原珠海南通扬州贵阳东莞徐州大庆佛山威海洛阳淮安呼和浩特镇江潍坊桂林中山临沂咸阳包头嘉兴惠州泉州三亚赣州九江金华泰安榆林许昌新乡舟山慈溪南阳聊城海口东营淄博漳州保定沧州丹东宜兴绍兴唐山湖州揭阳江阴营口衡阳郴州鄂尔多斯泰州义乌汕头宜昌大同鞍山湘潭盐城马鞍山襄樊长治日照常熟安庆吉林乌鲁木齐兰州秦皇岛肇庆西宁介休滨州台州廊坊邢台株洲德阳绵阳双流平顶山龙岩银川芜湖晋江连云港张家港锦州岳阳长沙县济宁邯郸江门齐齐哈尔昆山柳州绍兴县运城齐河衢州太仓张家口湛江眉山常德盘锦枣庄资阳宜宾赤峰余姚清远蚌埠宁德德州宝鸡牡丹江阜阳莆田诸暨黄石吉安延安拉萨海宁通辽黄山长乐安阳增城桐乡上虞辽阳遵义韶关泸州南平滁州温岭南充景德镇抚顺乌海荆门阳江曲靖邵阳宿迁荆州焦作丹阳丽水延吉茂名梅州渭南葫芦岛娄底滕州上饶富阳内江三明淮南孝感溧阳乐山临汾攀枝花阳泉长葛汉中四平六盘水安顺新余晋城自贡三门峡本溪防城港铁岭随州广安广元天水遂宁萍乡西双版纳绥化鹤壁湘西松原阜新酒泉张家界黔西南保山昭通河池来宾玉溪梧州鹰潭钦州云浮佳木斯克拉玛依呼伦贝尔贺州通化朝阳百色毕节贵港丽江安康德宏朔州伊犁文山楚雄嘉峪关凉山雅安西藏四川广东河北山西辽宁黑龙江江苏浙江安徽福建江西山东河南湖北湖南海南贵州云南陕西甘肃青海台湾内蒙古广西宁夏香港澳门
培训资讯网 - 为兴趣爱好者提供专业的职业培训资讯知识

编程语言迷思,为什么它们都无法完美地处理错误?

编程语言 语言

【CSDN 编者按】似乎没有一种编程语言能够正确处理错误!

本文翻译自https://www.amazingcto.com/best-way-to-handle-errors-for-a-programming-language/

未经授权,禁止转载!

作者 | Stephan Schmidt 译者 | 明明如月出品 | CSDN(ID:CSDNnews)

当我们编写代码时,错误常常发生在我们调用其他函数的过程中:

fn f() {// 当 b() 返回一个错误时,可能会出现错误 a = b() ...}

问题在于:

  • 有时我们希望直接从函数中返回,不处理错误

  • 有时我们希望减轻错误的影响

  • 有时我们希望延迟处理错误的时机,比如和其他错误一起处理,最好是用正常的控制流继续执行

每种编程语言都找到了一种不同的解决方案来应对这三个挑战。

Java

Java 是最早采用异常机制(Exceptions)来控制错误的编程语言之一。方法b() 可以在发生错误时抛出异常。调用函数如果什么都不做,此时调用函数 f() 就会将异常抛给它的调用者。当然,我们可以通过把调用包装在 try/catch 代码块中,以便稍后处理异常。

Java 方法的缺点是,一旦发生错误,就会打破正常的控制流程。我们要么处理它,要么让它传递上来。

Java 异常机制的一个缺点是声明检查异常。如果我们的函数 f() 声明了它的异常,而函数 b() 抛出了不同的异常,此时,我们就需要处理异常,因为它不能往上冒泡。

Rust

Rust 通过一个机制找到了这个问题的解决方案,这个机制可以自动将一个错误——即 b() 的错误——转换为另一个错误——即 f() 的错误。这样我们又可以让错误传递上来,而不用处理它。

Rust 使用 ? 来实现这一点:

fn f() { // 让函数 f() 返回 // 错误自动转换并传递上来 a = b()? ...}

Go

一些编程语言通过在返回值旁边返回一个错误码来处理这三个挑战。其中之一是 Go。

a, err := b()

接下来我们可以通过下面的方式处理错误:

if err != nil { .... }

或者选择从函数中返回。

除非我们想要对某些操作进行处理,否则在出现错误后,我们可以恢复正常的程序流程。

a = a + 1

如果出现了错误并且 a 是 nil,这就不起作用了。

现在我们每次都可以检查 a 是否存在:

if a != nil { .... }

但这会变得繁琐且难以阅读。

一些编程语言使用 Monad (Monads 是一种在函数式编程中使用的结构,它可以将程序函数和它们的返回值组合起来,并在一个类型中添加额外的计算)来处理错误后的控制流问题。

// a 是 Result<A,E> 类型a = b()

有了 Result Monad,我就可以处理错误或从方法中返回。

如上所述,Rust 有一些特殊的语法用于返回:

a = b()?

有了问号,当 b() 返回错误时,函数将在那一行返回,并且错误会自动转换并传递上来。

我们也可以在错误的情况下执行正常的控制流,出现错误时,仍然可以使用 a ,非常神奇!

a = b()c = a.map(|v| v + 1)...// 稍后处理错误

在出现错误的情况下,c 也会是一个错误,否则 c 将包含 a 加 1 的值。这样,无论错误是否发生,我们都可以在错误后有相同的控制流。

这使得对代码的推理变得更加容易。

Zig 通过对类型进行注释,以 ! 的形式简化了 Result<A,E> 的表示。

// 返回 i32fn f() i32 {...}// 返回 i32 或错误fn f() !i32 {...}

Zig 还通过流分析解决了 Java 对异常声明的繁琐问题。它检查你的函数 f(),找出所有可能返回的错误。然后,如果你在调用代码中检查特定的错误,它会确保是详尽无遗的。

Rust 中的 ? 有一个特殊的语法,可以简化错误处理,出错时可立即返回。Java 有 try/catch 的特殊语法,如果我们不编写额外的代码,就不会立即返回并将错误信息返回给函数的调用者。

我们应该使用较简洁的语法

问题的关键在于:我们更经常做什么?返回错误还是继续执行?我们更常做的事情应该使用较简洁的语法。

在 Rust 中的 ? 的情况下,我们是否需要一个 ? 以便立即返回,或者用 ? 来阻止返回?

a = b()?

问号可以表示 “发生错误时返回”。或者,该行为可以是,如果 b() 返回错误,始终立即返回,而 ? 可以阻止这种情况。

这取决于哪种情况更常见。

Golang 可能会给我们另一个思路。

当函数返回时,它有一个特殊的语法用于执行一些清理操作:

f := File.open("my.txt")// 退出函数时确保关闭文件defer f.close()a, err = b()if err != nil { // 这里调用 f.close() return}

Java 中的 finally 不太优雅。看起来人们认为错误应该传递上来,而我们需要在这种情况下进行简单的清理。

从我的经验来看,我也怀疑我们想让大多数错误自动转换后往上传递,因此 ? 可能应该表示我们不希望函数返回,Rust 却和该预期完全相反。

看起来 Java 在异常处理上是正确的。没有暴露向上传递错误的语法。但是它错过了自动转换和来自 Rust 的 Exception<V,E>,以及类似 Go 的本地、简单的 defer,而不是 Java 冗长的 finally。而且 Java 没有解释如何正确地使用异常,所以每个人都用错了。

假设有这样一种语言:

fn f() { // b() 返回 Result<V,E> 或 Zig 中的 !V, // 如果 b 是错误,f() 就返回 // a 是 V 类型 a = b() // 错误时不返回,但 a 是 Result<V,E> 或 !V 类型 a = b()! // 编译为 a = a.map(|v| v + 1) a = a + 1 // 编译为 c = a.map(|v| v.c()) // c 是 Result<C,E> 类型 c = a.c() ...}

这具有更高的可读性。

但是,当我们调用另一个方法时应该怎么办?

上一篇:国际教育职场最不该错过的聚会!ISHR峰会

下一篇:CVPR 2023线下分享会全日程公布,这周六不见不散

相关内容

体育类校外培训迎来强监管时代

实习记者 | 陈琼烨体育类校外培训机构的监管进一步收紧。办学资质、教师资质、资金监管等动作已开始在体育培训行业上演。近日,上海市体育局会同上海市教育委员会制定了《上海市体育类校外培训机构设置标准》(征求意见稿) ,明确了机构设置、培训场地···

自治区少工委举办“学习二十大 争做好队员”第一期少先队小骨干暨优秀红领巾讲解员线上培训班

为深入学习宣传贯彻党的二十大精神,进一步在全区广大少先队辅导员、少先队小骨干和红领巾讲解员中持续掀起学习党的二十大精神热潮,加强少先队小骨干和红领巾讲解员队伍建设,提高红领巾讲解员的宣讲能力。12月10日,自治区少工委举办“学习二十大 争做···

(夏云)改变世界,先要改变自己:圆桌课程学习后的一点小感悟

(夏云图文)前天我应邀参加了一天在静安洲际酒店举办的圆桌拜访会议,作为圆桌家庭的一名新成员,我是首次在上海参加了这样的拜访会,在会上,来自世界各地的学员们发自肺腑的精彩分享,让我动容,甚至让我流泪,我不禁深深感到,圆桌课程真是太神奇,太令人···

紫阳县城关镇中心学校举行 “真爱梦想”2023年暑期教师培训活动

7月11日,“真爱梦想2023年梦想教练计划·暑期梦想教师培训(紫阳站)”在紫阳县城关镇中心学校举行。本次培训由县教体科技局和上海真爱梦想公益发展中心主办,城关镇中心学校承办。县乡村振兴局、教体科技局相关领导和真爱梦想项目负责人出席启动仪···

圆满结业!这个培训干货满满!

为深入学习宣传党的二十大精神,结合习近平新时代中国特色社会主义思想主题教育,文化馆开展服务宣传周系列活动——全区群众艺术馆馆长及76个县(区)艺术团团长培训班在上海圆满结业。一、培训内容本次培训班采用专家讲座、现场教学、交流分享等形式进行教···

如何鉴别学科类和非学科类培训?指南来了

“双减”大潮下,一些传统学科类培训也悄然变身“素养课”“表达课”“阅读课”。这些换了名字、换了形式的校外培训,还是学科类校外培训吗?今年7月,教育部办公厅印发了《关于进一步明确义务教育阶段校外培训学科类和非学科类范围的通知》。各地在细化校外···

为首开先河的大学生养老社工培训班点赞

上海至少需要6000多名养老社会工作者,而目前岗位人才缺口则在一半以上。眼下,来自上海18所高校、21个专业的约200名大学生正在上海首届大学生养老社工培训班受训。(10月11日 中国新闻网)截至2021年年底,全国60岁及以上老年人口达2···

进入上海顶尖汽修培训学校,这些云南老师学到了啥?真本领

“此次到上海参加培训,让我们接触到了最先进的汽车维修技艺和规范标准,对今后的教学大有帮助。”日前,在上汽通用汽车经销商培训中心,即将结束培训返回云南的红河技师学院老师李斌由衷地表示。这也意味着,为期三周的沪滇汽车维修专业教师能力提升公益培训···

全国碳市场能力建设(上海)中心辽宁培训基地在沈阳成立

2021年5月19日,由上海环境能源交易所和沈阳环境资源交易所联合建立的“全国碳市场能力建设(上海)中心辽宁培训基地”正式落户沈阳,辽宁省生态环境厅和沈阳市生态环境局的领导及相关负责同志、上海环境能源交易所的相关负责同志、沈阳环境资源交易所···

【文旅要闻】集业务培训一箭之功 助产业发展一臂之力——全省2023年文化旅游产业示范项目提升培训班见闻

八月的庆阳,高天厚土,草木葳蕤。循着南梁精神赓续传承的红色基因之路,全省2023年文化旅游产业示范项目提升培训班在此举办。培训定位助力文旅项目建设、提升产业发展水平,对100余名市州文旅部门干部和文旅企业家进行实训,旨在从智力、理念、方法上···

缴纳几千元培训费即可进国企躺赚?36人涉罪刑拘!

看似正规的培训公司,实际却是层层圈套编织的陷阱,号称缴纳几千元培训费,就能获得专业工作证件,既可选择在国企实现月薪过万,也可挂靠证书,“躺着”赚钱。5月22日,海报新闻从上海市公安局获悉,松江警方成功侦破一起诈骗案,36名涉案人员均因涉嫌诈···

剑桥KET/PET要“凉凉”?教育部宣布不再承办该考试,有教育机构竟立刻“支招”引转“战场”

教育不承办了,这考试估计要凉了吧。”“我们家正在准备,这还要不要考了啊?”“我怎么感觉‘小托福’马上要火了。”昨天,教育部考试中心的一则公告,在小学生家长中间引发热议。教育部称,经与英国剑桥大学英语考评部友好协商,从即日起不再承办剑桥通用英···

纪念严定宪|《大闹天宫》的创作前后跨了4年

【编者按】中国共产党党员、著名动画艺术家、《大闹天宫》首席动画设计、一级导演严定宪先生,因病于2022年12月26日凌晨4时24分去世,享年86岁,曾任中国影协理事、上海影协理事、中国动画学会副会长、国际动画协会(ASIFA)会员,享受国务···

舞剧《永不消逝的电波》为何一票难求

光明日报记者 苏丽萍12月6日至8日,上海歌舞团舞剧《永不消逝的电波》进京在国家大剧院演出5场,演出票瞬间被抢光。12月8日晚,该剧在国家大剧院举办百场纪念演出专场。自2018年12月20日启动首轮试演以来,短短一年时间,《永不消逝的电波》···

“舞动十二小时”在上海国际舞蹈中心点亮“艺术天空”

光明网讯11月3日,由中国上海国际艺术节组委会办公室、长宁区人民政府、上海国际舞蹈中心发展基金会携手举办的“舞动十二小时”特别活动在上海国际舞蹈中心举行。辛丽丽芭蕾大师公开课作为在“艺术天空”板块中首次推出的舞动12小时特别活动,辛丽丽、谭···

这家网课平台套路太溜:一边招新学员,一边将老学员课程变成“缩水积分”

自去年9月起,上海市民郑女士就再也约不到“阿卡索”平台上的英语课了。“去年12月登录时,账户里就看不到剩余课程了。后来直接给我兑换成积分,说是可以换东西,结果3月积分也清零了。”联系不上客服,申请退费迟迟无人处理,郑女士所在的维权群里,不少···

英格卡购物中心自有趣玩体验空间PlayLab圆满收官

荟玩有趣 尽在荟聚(2023年2月6日,上海)英格卡购物中心自1月起在国内7座荟聚(购物中心)先后推出的自有趣玩体验空间“PlayLab荟趣实验室”于昨日圆满收官。1月16日至29日,该限时体验空间于7座荟聚同时呈现,期间共计近400万人次···

太难了!300人竞争12个名额,沪上插班考竞争太激烈

从去年开始,很多学校都发布了插班的消息,而许多参加了插班生考试的家长都表示,插班考竞争是越来越大了!插班考试由学校命题,所以不同学校插班生考试难度不同。根据家长们的反馈,小编大致整理了一下各校插班考的难度排名,大致如下:最难:星河湾、世外中···

“期中考试”来了,快来测测你的上海话水平!

你的上海话水平怎么样?看了小布推出的上海话栏目后有没有进步呢?来跟小布一起进行一次上海话“期中考试”吧!来,请同学们向下滑动,认真答题,再点击空白处核对正确答案,看看大家都能答对多少题?笔试部分选择题1下列物品中,上海人在过冬时一般不会用到···

征稿启事丨第七届口语传播学术论坛

2012年堪称我国国际传播史上的关键节点。在这一年,中央电视台的两个海外分台——北美分台(如今的CGTN America)和非洲分台(如今的CGTN Africa)正式开播,自此,我们拥有了向世界述说中国的崭新“话筒”。从2012到2021···

友情链接