Catching Go errors with errors.Is()
Go error handling
Anyone who has done some development in Go will be familiar with the Go philosophy on error handling and the following pattern:
result, err := myFunc(args)
if err != nil {
// do something
}
Catching errors
As many Gophers, over time I have grown accustomed to the inevitability of Go’s errors and come to appreciate this explicit and sturdy way of handling errors. Up till recently, however, there was one aspect about Go errors that kept confusing me, namely how to catch specific errors.
Let’s look at the following example:
file, err := os.Open("myfile")
if err != nil {
// handle error
}
In a case like this, coming from a Python background, I would like to use try…catch… pattern, for instance, to create myfile
should it not exist.
In idiomatic Go there are two solutions for this.
The first is to rewrite the code to first check whether the file exists (you can use os.Stat()
for that) and, if not, create it — this is probably preferable in this case.
The second is to make use of errors.Is()
— this can be used if there is no workaround (see below).