比较Golang中的错误信息

huangapple go评论120阅读模式
英文:

Compare error message in golang

问题

假设我在 Golang 中创建了一个新的错误,如下所示:

  1. err := errors.New("SOME_COMMON_ERROR_CODE")

在 Java 中,我习惯于通过 GetMessage() 方法获取异常消息。如果返回的是错误,我该如何进行比较呢?

  1. if some_err := some_package.DoSomething(); some_err != nil {
  2. if some_err.Error() == "SOME_COMMON_ERROR_CODE" {
  3. // 处理错误
  4. }
  5. }

在 Golang 中,错误类型实现了 error 接口,其中包含一个 Error() 方法,用于返回错误的字符串表示。因此,你可以使用 Error() 方法获取错误的字符串表示,并将其与预期的错误代码进行比较。

英文:

Let's say I create a new error in golang like so

  1. err := errors.New("SOME_COMMON_ERROR_CODE")

In java, I'm used to being able to get Exception with GetMessage() messages. How would I compare that error if returned?

  1. if some_err := some_package.DoSomething(); some_err != nil {
  2. if some_err.GetMessage() == "SOME_COMMON_ERROR_CODE" {
  3. // handle it however.
  4. }
  5. }

How is this done in golang?

答案1

得分: 12

声明一个包级别的变量来表示错误:

  1. var errExample = errors.New("this is an example")

在返回错误时使用这个值。通过与这个值进行比较,检查特定的错误:

  1. if err == errExample {
  2. // 处理错误
  3. }

如果包外的代码需要访问这个错误,将变量导出:

  1. var ErrExample = errors.New("this is an example")

使用方法如下:

  1. if err == somepackage.ErrExample {
  2. // 处理错误
  3. }

这里有一些示例

避免与错误的 Error() 方法返回的字符串进行比较。这可能会使你的代码变得脆弱。

英文:

Declare a package level variable with the error:

  1. var errExample = errors.New("this is an example")

Use this value when returning errors. Compare against this value to check for the specific error:

  1. if err == errExample {
  2. // handle it
  3. }

Export the variable if code outside the package needs to access the error:

  1. var ErrExample = errors.New("this is an example")

Use it like this:

  1. if err == somepackage.ErrExample {
  2. // handle it
  3. }

Here are some examples.

Avoid comparing against the string returned from the error's Error() method. It can make your code brittle.

答案2

得分: 9

我们也可以这样比较错误:

  1. 如果你创建了这样的错误 [基于错误代码]

_

  1. var errExample = errors.New("ERROR_CODE")

那么你可以直接这样检查错误:

  1. if err.Error() == "ERROR_CODE" {
  2. // 做一些错误处理
  3. }
  1. 如果你创建了这样的错误 [基于错误代码]

package mypackage

  1. var NoMoreData = errors.New("没有更多数据")

现在你可以在任何地方这样检查:

  1. if err != mypackage.NoMoreData{
  2. // 做一些错误处理
  3. }

如果你想同时比较两个错误,可以这样做:

  1. err1 := errors.New("捕获到错误")
  2. err2 := errors.New("捕获到错误")
  3. fmt.Println(err1 == err2) // false | 不要这样做
  4. fmt.Println(err1.Error() == err2.Error()) // true | 这样做

就是这样。

英文:

we can also compare errors like that:

  1. If you creating error like this [Error Code Based]

_

  1. var errExample = errors.New("ERROR_CODE")

then you can directly check error like this

  1. if err.Error() == "ERROR_CODE" {
  2. //Do something error caught
  3. }
  1. If you creating error like this [Error Code Based]

package mypackage

  1. var NoMoreData = errors.New("No more data")

Now you can check anywhere like this

  1. if err != mypackage.NoMoreData{
  2. //Do something error caught
  3. }

If you want to compare two errors at a time then you can do like this:

  1. err1 := errors.New("Error Caught")
  2. err2 := errors.New("Error Caught")
  3. fmt.Println(err1 == err2) // false | Never do like this
  4. fmt.Println(err1.Error() == err2.Error()) // true | Do like this

That's All.

huangapple
  • 本文由 发表于 2017年1月10日 10:38:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/41560241.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定