保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

Golang中更好的错误处理理论和实践技巧

  云和安全管理服务专家新钛云服张春翻译编程语言应该如何处理错误?例如,打开具有给定名称的文件并将其读取到缓冲区的函数可能由于多种原因而失败:文件可能不存在,打开的程序可能没有打开它的权限,或者它可能太大而无法容纳缓冲区;大多数语言都使用异常:抛出的异常通过调用堆栈传播直到在trycatch块中处理的级别。异常模型将错误视为特殊情况,与程序的常规返回值流程分开处理。
  这种方法有几个缺点。首先,它可以对程序员隐藏错误处理路径,特别是在捕获异常不是强制性的情况下,例如在Python中。即使在具有必须处理的Java风格的检查异常的语言中,如果在与原始调用不同的级别上处理错误,也并不总是很明显错误是从哪里引发的。
  我们都见过长长的代码块包装在一个trycatch块中。在这种情况下,catch块实际上充当goto语句,这通常被认为是有害的(奇怪的是,C中的关键字被认为可以接受的少数用例之一是错误后清理,因为该语言没有Golang样式延迟语句)。
  如果你确实从源头捕获异常,你会得到一个不太优雅的Go错误模式版本。这可能会解决混淆代码的问题,但会遇到另一个问题:性能。在诸如Java之类的语言中,抛出异常可能比函数的常规返回慢数百倍。
  Java中最大的性能成本是由打印异常的堆栈跟踪造成的,这是昂贵的,因为运行的程序必须检查编译它的源代码。仅仅进入一个try块也不是空闲的,因为需要保存CPU内存寄存器的先前状态,因为它们可能需要在抛出异常的情况下恢复。
  如果您将异常视为通常不会发生的异常情况,那么异常的缺点并不重要。这可能是传统的单体应用程序的情况,其中大部分代码库不必进行网络调用一个操作格式良好的数据的函数不太可能遇到错误(除了错误的情况)。一旦您在代码中添加IO,无错误代码的梦想就会破灭:您可以忽略错误,但不能假装它们不存在!
  try{
  doSometing()
  }catch(IOExceptione){
  ignoreit
  }
  与大多数其他编程语言不同,Golang接受错误是不可避免的。如果在单体架构时代还不是这样,那么在今天的模块化后端服务中,服务通常和外部API调用、数据库读取和写入以及与其他服务通信。
  以上所有方法都可能失败,解析或验证从它们接收到的数据(通常在无模式JSON中)也可能失败。Golang使可以从这些调用返回的错误显式化,与普通返回值的等级相同。从函数调用返回多个值的能力支持这一点,这在大多数语言中通常是不可能的。Golang的错误处理系统不仅仅是一种语言怪癖,它是一种将错误视为替代返回值的完全不同的方式!
  重复iferr!nil
  对Go错误处理的一个常见批评是被迫重复以下代码块:
  res,err:doSomething()
  iferr!nil{
  Handleerror
  }
  对于新用户来说,这可能会觉得没用而且浪费行数:在其他语言中需要3行的函数很可能会增长到12行:
  这么多行代码!这么低效!如果您认为上述内容不优雅或浪费代码,您可能忽略了我们检查代码中的错误的全部原因:我们需要能够以不同的方式处理它们!对API或数据库的调用可能会被重试。
  有时事件的顺序很重要:调用外部API之前发生的错误可能不是什么大问题(因为数据从未通过发送),而API调用和写入本地数据库之间的错误可能需要立即注意,因为这可能意味着系统最终处于不一致的状态。即使我们只想将错误传播给调用者,我们也可能希望用失败的解释来包装它们,或者为每个错误返回一个自定义错误类型。
  并非所有错误都是相同的,并且向调用者返回适当的错误是API设计的重要部分,无论是对于内部包还是RESTAPI。
  不必担心在你的代码中重复iferr!nil这就是Go中的代码应该看起来的样子。
  自定义错误类型和错误包装
  从导出的方法返回错误时,请考虑指定自定义错误类型,而不是单独使用错误字符串。字符串在意外代码中是可以的,但在导出的函数中,它们成为函数公共API的一部分。更改错误字符串将是一项重大更改如果没有明确的错误类型,需要检查返回错误类型的单元测试将不得不依赖原始字符串值!事实上,基于字符串的错误也使得在私有方法中测试不同的错误案例变得困难,因此您也应该考虑在包中使用它们。回到错误与异常的争论,返回错误也使代码比抛出异常更容易测试,因为错误只是要检查的返回值。不需要测试框架或在测试中捕获异常。
  可以在databasesql包中找到简单自定义错误类型的一个很好的示例。它定义了一个导出常量列表,表示包可以返回的错误类型,最著名的是sql。ErrNoRows。虽然从API设计的角度来看,这种特定的错误类型有点问题(您可能会争辩说API应该返回一个空结构而不是错误),但任何需要检查空行的应用程序都可以导入该常量并在代码中使用它不必担心错误消息本身会改变和破坏代码。
  对于更复杂的错误处理,您可以通过实现返回错误字符串的Error()方法来定义自定义错误类型。自定义错误可以包括元数据,例如错误代码或原始请求参数。如果您想表示错误类别,它们很有用。DigitalOcean的本教程展示了如何使用自定义错误类型来表示可以重试的一类临时错误。
  通常,错误会通过将低级错误与更高级别的解释包装起来,从而在程序的调用堆栈中传播。例如,数据库错误可能会以下列格式记录在API调用处理程序中:调用CreateUser端点时出错:查询数据库时出错:pq:检测到死锁。这很有用,因为它可以帮助我们跟踪错误在系统中传播的过程,向我们展示根本原因(数据库事务引擎中的死锁)以及它对更广泛系统的影响(调用者无法创建新用户)。
  自Go1。13以来,此模式具有特殊的语言支持,并带有错误包装。通过在创建字符串错误时使用w动词,可以使用Unwrap()方法访问底层错误。除了比较错误相等性的函数errors。Is()和errors。As()外,程序还可以获取包装错误的原始类型或标识。这在某些情况下可能很有用,尽管我认为在确定如何处理所述错误时最好使用顶级错误的类型。
  Panics
  不要panic()!长时间运行的应用程序应该优雅地处理错误而不是panic。即使在无法恢复的情况下(例如在启动时验证配置),最好记录一个错误并优雅地退出。panic比错误消息更难诊断,并且可能会跳过被推迟的重要关闭代码。
  Logging
  我还想简要介绍一下日志记录,因为它是处理错误的关键部分。通常你能做的最好的事情就是记录收到的错误并继续下一个请求。
  除非您正在构建简单的命令行工具或个人项目,否则您的应用程序应该使用结构化的日志库,该库可以为日志添加时间戳,并提供对日志级别的控制。最后一部分特别重要,因为它将允许您突出显示应用程序记录的所有错误和警告。通过帮助将它们与信息级日志分开,这将为您节省无数时间。
  微服务架构还应该在日志行中包含服务的名称以及机器实例的名称。默认情况下记录这些时,程序代码不必担心包含它们。您也可以在日志的结构化部分中记录其他字段,例如收到的错误(如果您不想将其嵌入日志消息本身)或有问题的请求或响应。只需确保您的日志没有泄露任何敏感数据,例如密码、API密钥或用户的个人数据!
  对于日志库,我过去使用过logrus和zerolog,但您也可以选择其他结构化日志库。如果您想了解更多信息,互联网上有许多关于如何使用这些的指南。如果您将应用程序部署到云中,您可能需要日志库上的适配器来根据您的云平台的日志API格式化日志没有它,云平台可能无法检测到日志级别等某些功能。
  如果您在应用程序中使用调试级别日志(默认情况下通常不记录),请确保您的应用程序可以轻松更改日志级别,而无需更改代码。更改日志级别还可以暂时使信息级别甚至警告级别的日志静音,以防它们突然变得过于嘈杂并开始淹没错误。您可以使用在启动时检查以设置日志级别的环境变量来实现这一点。
  原文:https:levelup。gitconnected。combettererrorhandlingingolangtheoryandpracticaltips758b90d3f6b4

神奇的沙湖小学作文600字今年暑假,我去了沙湖。她位于宁夏回族自治区,是黄河边上的一个大湖泊。我在岸边坐上了游船,船在一簇簇绿得鲜亮、绿得耀眼的芦苇间穿行,一直向湖泊深处驶去。这些芦苇有的面积很大……using和awaitusing有什么不同?咨询区JustinLessard:我注意到在某些情况下,visualstudio经常推荐我这么做。awaitusingvardisposablenewDisposable……学跳绳作文范文篇一:学跳绳每当课间的时候,都会有许多同学在操场上跳绳,他们跳得又快又多,我心里既羡慕又着急。说起来你可能不信,我还不会跳绳呢!其实,我一直都想学会它,可是,我都已经三年……我们的何老师作文400字有这么一个园丁,她用她那特殊的方式滋润着祖国的花朵,她是谁呢,她就是我们的何老师。何老师常对我们说:学习是自己的事,老师只是引路员,把你扶稳了,但是路还是要你自己去走。开……十三部门修订发布网络安全审查办法36氪获悉,近日,国家互联网信息办公室等十三部门联合修订发布《网络安全审查办法》,自2022年2月15日起施行。《办法》将网络平台运营者开展数据处理活动影响或者可能影响国家安全……爱护环境的英语作文3篇环境是指周围所存在的条件,总是相对于某一中心事物而言的。下面是小编为你带来的爱护环境的英语作文3篇,欢迎阅读。篇一:Humanactivityamp;theEarthTh……将来小程序的规划元旦头像挂件小程序从开发到现在流量红利结束了,接下来从长期来看,大船计划做以下3点:1、打造矩阵经过这次小程序从开发到上线,以及后续得到的数据发现,搜索在小程序打开……孝道有感作文600字ldquo;孝rdquo;,一个简简单单的字眼,不仅是良好的道德品质,更是中华民族优良的传统美德,是被无上推崇的。小编整理了相关的作文范文,欢迎欣赏与借鉴。孝道有感作文6……摩登时代观后感1000字《摩登时代》的主角卓别林,一听这名字片便会认为这是一部喜剧,肯定搞笑动作连接不断,肯定会让我们笑语连篇的,然而剧中的卓别林更似代罪羔羊,我们的快乐好似是建立在他们的痛苦之上,而……给自己的一封信小学优秀范文老师、爸爸、妈妈。从今天起,我要做一个孝顺父母,爱护集体,好好学习,天天向上的好孩子。老师、爸爸、妈妈。请你们相信我,从今天起,我要做一个孝顺妈妈的好孩子,做一个老师心目……为什么有些老人听力不好还不愿意戴助听器呢?你是卖助听器的师傅吗?你好,大部分老人觉得大声说话还是可以听见,对助听器知识了解较少,还有就是助听器的价格很多老人就接受不了你好!老人出现听力下降,如果长时间听不好……油耳朵能戴助听器吗?你好!油耳是湿型耵聍,如果油耳听力在适配范围之内可以佩戴助听器,可以选配耳背式助听器,注意清理耳道和助听器耳塞即可。谢谢邀请,你说的右耳朵是耳朵里边的油性大吗?如果是的话……
乐山中考满分作文范文赏析挫折也是一种养料挫折是生活给予的养料,它会使生活变得夺目。下面是小编整理的挫折也是一种养料满分作文,欢迎大家参考阅读!【作文题目】23。半命题作文。(60分)人的成长需要丰富……工信部春节移动数据流量持续较快增长,连续3年增速超20从工信部了解到,2022年春节期间,移动通信数据流量持续较快增长,连续3年增速超过20。统计显示,2022年春节7天假期里,移动互联网接入流量达到434。9万TB(1TB102……书似阶梯伴我成长高中生作文书中自有颜如玉,书中自有黄金屋。书或许能改变我的一生。记得我第一次看到那本书,我就深深地被迷住了,封面统一成金色,一位女孩闭着眼漫步在太阳花中,不知为什么,我的脸庞立即浮……友谊永不褪色(读夏洛的网有感)mdash;mdash;读《夏洛的网》有感外表、身份,不能够完全代表一个人的品德和情操,内涵才是一种不可多得的美。mdash;mdash;题记。夏洛很平静地闭上了眼……我们的联欢会五年级作文记得五年级寒假,我们几个小伙伴举行了一次盛大的联欢晚会。晚会前一天,我和几个好朋友忙碌了起来。我们决定晚会在一棵桔子树下举行。于是,我们给桔树打扮了起来。周蜜回家拿……莫让刷分控评毁了网络诚信环境胡立彪互联网时代,网络平台评分已成为越来越多网友消费的参考。同时,消费者在各类网络平台上对商品或者服务进行打分,发表自己的看法和感受,也形成了互联网自发的监督体系。然而近……御银股份,翠微股份,岭南股份,宁德时代,大金重工,士兰微欣旺达是锂电池制造商。安妮股份是虚拟现实概念龙头。御银股份调整比较多。苏宁电器是电商概念。陕西黑猫是煤炭概念。得利斯是猪肉预制菜概念。新莱应材历史新高。湖北广电元宇宙概念。岭南……我爱桐中桐中,知识的殿堂。我们是一群求学的渴望者,向往于桐庐中学的熠熠光辉;我们是一颗颗待滋润的小树苗,渴望着沙沙春雨的孕育灌溉。当我们徘徊在这座殿堂之外时,多少次,将羡慕的眼光投向能……新能源汽车发展大招频频来源:经济参考报工信部近日发布数据显示,2021年,我国新能源汽车发展迅猛,产销量均超过350万辆,同比增长1。6倍。2022年,工信部将全力推进新能源汽车发展再上台阶。产业配……张云明已任工信部党组成员副部长工业和信息化部(简称工信部)领导班子新增一员。澎湃新闻查询发现,工信部官网部领导一栏于近日更新调整,张云明已任该部党组成员、副部长,位列副部长徐晓兰与部党组成员、国家烟草……初一日记摇篮草我的家里养了一株摇篮草。摇篮草中心的叶子是嫰白色的,外面的叶子是半绿半黄的,后来,摇篮草的叶子逐渐长大,就伸出一根茎来,然后,茎的角尖上就长出五六片叶子,然后,茎上的叶子……大数据之Tez搭建与使用一、搭建Tez是一个Hive的运行引擎,性能优于MRTez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能1……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网