2016-08-24 211 views
12

我有当控制台打印错误对象给了我Token is expired如何比较Golang错误对象

我如何可以与特定的误差值进行比较。我试过但没有工作。

if(err == errors.New("Token is expired")){ 
     log.Printf("Unauthorised: %s\n", err) 
} 
+3

我会避免使用接受的方法。查看DαveCheney关于错误处理https://www.youtube.com/watch?v=lsBF58Q-DnY的演示文稿。我一定会回答你的问题。 – s7anley

回答

13

尝试

err.Error() == "Token is expired" 

或实现错误界面创建自己的错误。

3

错误类型是接口类型。一个错误变量表示可以将自己描述为一个字符串的任何值。下面是接口的声明:

type error interface { 
    Error() string 
} 

最常用的错误执行是错误包的未导出Errorstring,则类型:

// errorString is a trivial implementation of error. 
type errorString struct { 
    s string 
} 

func (e *errorString) Error() string { 
    return e.s 
} 

查看运行代码输出(The Go Playground):

package main 

import (
    "errors" 
    "fmt" 
    "io" 
) 

func main() { 
    err1 := fmt.Errorf("Error") 
    err2 := errors.New("Error") 
    err3 := io.EOF 

    fmt.Println(err1)   //Error 
    fmt.Printf("%#v\n", err1) // &errors.errorString{s:"Error"} 
    fmt.Printf("%#v\n", err2) // &errors.errorString{s:"Error"} 
    fmt.Printf("%#v\n", err3) // &errors.errorString{s:"EOF"} 
} 

输出:

Error 
&errors.errorString{s:"Error"} 
&errors.errorString{s:"Error"} 
&errors.errorString{s:"EOF"} 

另见:Comparison operators

比较运算符比较两个操作数,得到一种无类型的布尔 值。在任何比较中,第一个操作数必须可分配给第二个操作数的 类型,反之亦然。

等于运算符==!=适用于与 相当的操作数。

指针值是可比较的。如果指针 指向相同的变量或两者的值均为零,则两个指针值相等。指向 的不同的零大小的变量可能相等,也可能不相等。

接口值是可比的。如果 它们具有相同的动态类型和相同的动态值,或者两个 的值均为零,则两个接口值相等。

非接口类型X的值x和接口类型T 的值t是当X型的值是可比较的可比较的和X实现 T.它们是相等的,当吨的动态类型是相同的X和T的 动态值等于x。

如果所有字段都具有可比性,则结构值具有可比性。两个 结构值是相等的,如果它们对应的非空白字段是 相等。


所以:

1 - 您可以使用Error(),像这样的工作代码(The Go Playground):

package main 

import (
    "errors" 
    "fmt" 
) 

func main() { 
    err1 := errors.New("Token is expired") 
    err2 := errors.New("Token is expired") 
    if err1.Error() == err2.Error() { 
     fmt.Println(err1.Error() == err2.Error()) // true 
    } 
} 

输出:

true 

2-您也可以与nil进行比较,这样的工作码(The Go Playground):

package main 

import (
    "errors" 
    "fmt" 
) 

func main() { 
    err1 := errors.New("Token is expired") 
    err2 := errors.New("Token is expired") 
    if err1 != nil { 
     fmt.Println(err1 == err2) // false 
    } 
} 

输出:

false 

3-你也可以用完全相同的错误比较它,像这样的工作代码
The Go Playground):

package main 

import (
    "fmt" 
    "io" 
) 

func main() { 
    err1 := io.EOF 
    if err1 == io.EOF { 
     fmt.Println("err1 is : ", err1) 
    } 
} 

输出:

err1 is : EOF 

裁判:https://blog.golang.org/error-handling-and-go

10

库中的定义错误值

package fruits 

var NoMorePumpkins = errors.New("No more pumpkins") 

不要在代码的任何地方创建errors.New错误,但返回预定值,每当发生错误,然后您可以执行以下操作:

package shop 

if err == fruits.NoMorePumpkins { 
    ... 
} 

请参阅io包错误供参考。

+0

另一个缺点是另一个软件包可能会覆盖导出的'NoMorePumpkins'变量的值。如果有一种方法可以用'const' – captncraig

+1

@captncraig来做到这一点,那么你可以使用getter函数 –

+0

@WingerSendon好点。这可能是我最喜欢的解决方案。 – captncraig

5

软件包可以导出他们使用的错误变量,以便其他人可以与它们进行比较。例如,如果从名为MYPKG产品包装中附带的错误,被定义为var ErrTokenExpired Error = errors.New("Token is expired")

那么你可以做:

if err == myPkg.ErrTokenExpired { 
    log.Printf("Unauthorised: %s\n", err) 
} 

如果错误来自第三方软件包,并且不使用导出错误的变量然后你可以做的只是比较你从err.Error得到的字符串()

+0

比比较字符串好很多。 – middlehut