当前位置: 首页 > 网络应用技术

四种方法的治疗方法

时间:2023-03-05 18:22:23 网络应用技术

  GO的错误处理一直受到批评,但是从另一个角度来看,GO的错误仍然非常易于使用。错误具有两个非常重要的功能:

  在GO1.13之后,错误软件包中提供了一些功能,使错误的处理和跟踪更方便。本文将讨论GO中的常见错误方式与错误功能结合使用。

  应该注意的是,此处提到的错误软件包是指GO中的本机错误数据包,而不是https://github.com/pkg/error。后者是本机EROT的一些包装,使用更方便。

  在GO的错误处理中,以下代码说明了绝大多数:

  在满足业务需求的情况下,这种错误处理实际上是最建议的方法。这种直接的透明度方法使代码之间的耦合使得较低。在许多情况下,如果您不关心错误中的特定信息,则可以使用此方法。

  在某些情况下,本机错误并不是很方便。例如,我需要获取特定的错误消息。如果上述方法用于使用该错误,则可能会显示以下代码:

  那些书面代码的人知道上面的代码不是优雅的。一方面,使用魔术值。此外,在错误的信息更改之后,这里的代码逻辑将造成错误。

  您可以将错误定义为变量:

  然后可以将上述代码转变为:

  如果需要一次处理更多错误,则还可以使用Switch进行处理:

  但是此方法并不完美,因为在传输过程中,可能包装错误以携带更多堆栈信息,例如以下内容:

  假设上述包装的错误是ErrinvalidParam,然后在调用调用的位置判断错误,则无法使用以下代码:

  要解决此问题,错误。IS函数可以确定包装错误中是否存在预期错误:

  尝试使用错误来替换错误的比较。

  在某些情况下,上述错误使用情况仍然无法满足要求。如果以上无效的参数错误,则商务方希望知道哪个参数无效,并且直接定义的错误无法满足要求。

  错误本质上是一个接口,也就是说,只要实现了错误方法,它就是一个错误类型:

  然后,您可以自定义错误类型:

  然后,您可以使用类型的断言或类型的选择机制来处理不同类型的错误:

  它也可以在开关中使用:

  这里的错误也将存在包装的问题,并且错误可以用来解决此问题。它可以确定包装错误中是否存在某种错误类型:

  上述方法已经可以解决大多数场景的错误处理,但是在某些复杂情况下,可能需要更多信息,并且还包括一定的逻辑处理。

  在GO的网络包中,有这样的接口:

  在此界面中,有两种方法。这两种方法将处理此错误类型。判断是超时或临时错误。该接口的错误必须实现这两种方法并实现特定的判断逻辑。

  处理特定错误时,将调用相应的方法来判断:

  这种类型的错误相对较小。通常,尽量不要使用这种复杂的处理方法。

  在错误软件包中,除了上述两个非常有用的功能外,错误的两个非常有用的功能。IS和错误更为实用。此功能可以从包装错误中解决原始错误。

  您可以使用fmt.errorf进行包装错误,这需要由%w格式化:

  随后的错误处理时,您可以调用errors.unwrap函数以在包装之前获取错误:

  如果您觉得可以写它,请喜欢并鼓励它?如果有问题,请留言以交流

  文字 /雷蒙

  [1] https://go.dev/blog/errors-er-dalues

  [2] https://go.dev/blog/go1.13-错误