How to `catch` specific errors

Issue

For example, I am using one Go standard library function as:

func Dial(network, address string) (*Client, error)

This function may return errors, and I just care about errors which report “connection lost” or “connection refused”, then do some code to fix these.
It seems like:

client, err := rpc.Dial("tcp", ":1234")  
if err == KindOf(ConnectionRefused) {
  // do something
}

What’s more, how to get all the errors a specific standard library function may return?

Solution

There’s no standard way to do this.

The most obvious way, which should only be used if no other method is available, is to compare the error string against what you expect:

if err.Error() == "connection lost" { ... }

Or perhaps more robust in some situations:

if strings.HasSuffix(err.Error(), ": connection lost") { ... }

But many libraries will return specific error types, which makes this much easier.

In your case, what’s relevant are the various error types exported by the net package: AddrError, DNSConfigError, DNSError, Error, etc.

You probably care most about net.Error, which is used for network errors. So you could check thusly:

if _, ok := err.(net.Error); ok {
    // You know it's a net.Error instance
    if err.Error() == "connection lost" { ... }
}

What’s more, how to get all the errors a specific standard library function may return?

The only fool-proof way to do this is to read the source for the library. Before going to that extreme, a first step is simply to read the godoc, as in the case of the net package, the errors are pretty well documented.

Answered By – Flimzy

Answer Checked By – Clifford M. (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.