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-错误