解释Golang错误代码

问题描述:

因此,大多数go错误处理的示例只是将任何错误都传递回堆栈。在某些时候,这些需要解释,而这正是我想要做的。 这是我尝试的一个片段:解释Golang错误代码

resp, err := http.Get(string(url)) 
    defer out_count.Dec() 

    if err != nil { 

      switch err { 
      case http.ErrBodyReadAfterClose: 
        fmt.Println("Read after close error") 
      case http.ErrMissingFile: 
        fmt.Println("Missing File") 
      {some more cases here} 
      case io.EOF: 
        fmt.Println("EOF error found") 
      default: 
        fmt.Printf("Error type is %T\n", err) 
        panic(err) 
      } 
      return 

这不是工作,虽然我目前的情况下(编辑删除URL}:

ERROR: Failed to crawl "http://{removed URL}" 
Error type is *url.Error 
panic: Get http://{removed url}: EOF 

goroutine 658 [running]: 
runtime.panic(0x201868, 0x106352c0) 
     /usr/lib/go/src/pkg/runtime/panic.c:279 +0x1a0 
github.com/cbehopkins/grab/grab.crawl(0x10606210, 0x27, 0x105184b0, 0x105184e0, 0x10500460) 

我不能想出一个办法来获得switch语句来捕获这个错误,因为错误的文本每次都会改变,并且没有明确的值,我可以捕捉到(因为URL一直在改变)。现在,也许我可以在case语句中做某种正则表达式匹配,或者对错误字符串进行分片,但是感觉这是一种解决此问题的非常糟糕的方式。

有什么建议吗?必须有一种惯用的方式来肯定地发现这样的错误?

最简单的方法是在你的代码包级别的错误值:

var URLFetchError = errors.New("Cannot fetch URL") 

url := "http://www.google.com" 
res, err := http.Get(url) 
if err != nil { 
    return URLFetchError 
} 

switch就变成了:

switch err { 
case http.ErrBodyReadAfterClose: 
    fmt.Println("Read after close error") 
case URLFetchError: 
    fmt.Println("Error fetching URL") 

如果你想通过与更多的信息错误,您可以创建自己的自定义错误:

type MyError struct { 
    URL string 
} 

func (e MyError) Error() string { 
    return fmt.Sprintf("Error getting: %v", e.URL) 
} 

然后,您可以根据需要创建此错误。例如:

url := "http://www.google.com" 
res, err := http.Get(url) 
if err != nil { 
    return MyError{url} 
} 

最后,在你的错误检查方法,你可以使用类型转换,而不是简单的开关以获取错误:

switch err.(type) { 
case MyError: 
    fmt.Println("Error:", err) 
default: 
    fmt.Println("No Error") 
} 

在你的情况,因为你有定期的混合错误,您可以包括此检查嵌套switch

switch err { 
case http.ErrBodyReadAfterClose: 
    fmt.Println("Read after close error") 
case http.ErrMissingFile: 
    fmt.Println("Missing File") 
case io.EOF: 
    fmt.Println("EOF error found") 
default: // check for custom errors 
    switch err.(type) { 
    case MyError: 
     fmt.Println("custom error:", err) 
    default: 
     panic(err) 
    } 
} 
+0

感谢您的详尽答案! 我认为这个问题是我得到frm标准html包的错误没有提供我可以匹配的这些错误定义。 但是你是正确的,我可以先对错误类型进行切换,然后再对错误细节进行切换。 对于这个应用程序来说,这就足够了,现在我只需要弄清楚如何将这个请求反馈回标准的html包。 谢谢 –

您可以实现错误界面并创建您自己可能更容易处理的错误。

对于运行时错误a.k.a恐慌。你可以通过在你认为可能恐慌的函数中包含recover()来恢复。它在panicing函数返回之前调用。

defer func() { 
    if r := recover(); r != nil { 
     if _, ok := r.(runtime.Error); ok { 
       err = r.(error) //panic(r) 
      } 
      err = r.(error) 
     } 
    }() 
} 
+0

啊,我觉得你有误解,恐慌是有我停止代码时,有我的代码无法处理错误。它给我提供了一个调试,说我没有抓住所有我应该遇到的问题。 尽管感谢 –

+0

也许你不明白“实现错误界面”的含义是因为这就是你选择的答案。 – Sridhar