| <!--{ |
| "Title": "Return and handle an error" |
| }--> |
| |
| <p> |
| Handling errors is an essential feature of solid code. In this section, you'll |
| add a bit of code to return an error from the greetings module, then handle it |
| in the caller. |
| </p> |
| |
| <aside class="Note"> |
| <strong>Note:</strong> This topic is part of a multi-part tutorial that begins |
| with <a href="/doc/tutorial/create-module.html">Create a Go module</a>. |
| </aside> |
| |
| <ol> |
| <li> |
| In greetings/greetings.go, add the code highlighted below. |
| |
| <p> |
| There's no sense sending a greeting back if you don't know who to greet. |
| Return an error to the caller if the name is empty. Copy the following |
| code into greetings.go and save the file. |
| </p> |
| |
| <pre> |
| package greetings |
| |
| import ( |
| <ins>"errors"</ins> |
| "fmt" |
| ) |
| |
| // Hello returns a greeting for the named person. |
| func Hello(name string) <ins>(</ins>string<ins>, error)</ins> { |
| <ins>// If no name was given, return an error with a message. |
| if name == "" { |
| return "", errors.New("empty name") |
| }</ins> |
| |
| // If a name was received, return a value that embeds the name |
| // in a greeting message. |
| message := fmt.Sprintf("Hi, %v. Welcome!", name) |
| return message<ins>, nil</ins> |
| } |
| </pre> |
| |
| <p> |
| In this code, you: |
| </p> |
| |
| <ul> |
| <li> |
| Change the function so that it returns two values: a |
| <code>string</code> and an <code>error</code>. Your caller will check |
| the second value to see if an error occurred. (Any Go function can |
| return multiple values. For more, see |
| <a href="/doc/effective_go.html#multiple-returns">Effective Go</a>.) |
| </li> |
| <li> |
| Import the Go standard library <code>errors</code> package so you can |
| use its |
| <a href="https://pkg.go.dev/errors/#example-New" |
| ><code>errors.New</code> function</a |
| >. |
| </li> |
| <li> |
| Add an <code>if</code> statement to check for an invalid request (an |
| empty string where the name should be) and return an error if the |
| request is invalid. The <code>errors.New</code> function returns an |
| <code>error</code> with your message inside. |
| </li> |
| <li> |
| Add <code>nil</code> (meaning no error) as a second value in the |
| successful return. That way, the caller can see that the function |
| succeeded. |
| </li> |
| </ul> |
| </li> |
| |
| <li> |
| In your hello/hello.go file, handle the error now returned by the |
| <code>Hello</code> function, along with the non-error value. |
| |
| <p> |
| Paste the following code into hello.go. |
| </p> |
| |
| <pre> |
| package main |
| |
| import ( |
| "fmt" |
| <ins>"log"</ins> |
| |
| "example.com/greetings" |
| ) |
| |
| func main() { |
| <ins>// Set properties of the predefined Logger, including |
| // the log entry prefix and a flag to disable printing |
| // the time, source file, and line number. |
| log.SetPrefix("greetings: ") |
| log.SetFlags(0)</ins> |
| |
| // Request a greeting message. |
| <ins>message, err := greetings.Hello("")</ins> |
| <ins>// If an error was returned, print it to the console and |
| // exit the program. |
| if err != nil { |
| log.Fatal(err) |
| } |
| |
| // If no error was returned, print the returned message |
| // to the console.</ins> |
| fmt.Println(message) |
| } |
| </pre> |
| |
| <p> |
| In this code, you: |
| </p> |
| |
| <ul> |
| <li> |
| Configure the |
| <a href="https://pkg.go.dev/log/"><code>log</code> package</a> to |
| print the command name ("greetings: ") at the start of its log messages, |
| without a time stamp or source file information. |
| </li> |
| <li> |
| Assign both of the <code>Hello</code> return values, including the |
| <code>error</code>, to variables. |
| </li> |
| <li> |
| Change the <code>Hello</code> argument from Gladys’s name to an empty |
| string, so you can try out your error-handling code. |
| </li> |
| <li> |
| Look for a non-nil <code>error</code> value. There's no sense continuing |
| in this case. |
| </li> |
| <li> |
| Use the functions in the standard library's <code>log package</code> to |
| output error information. If you get an error, you use the |
| <code>log</code> package's |
| <a href="https://pkg.go.dev/log?tab=doc#Fatal" |
| ><code>Fatal</code> function</a |
| > |
| to print the error and stop the program. |
| </li> |
| </ul> |
| </li> |
| |
| <li> |
| At the command line in the <code>hello</code> directory, run hello.go to |
| confirm that the code works. |
| |
| <p> |
| Now that you're passing in an empty name, you'll get an error. |
| </p> |
| |
| <pre> |
| $ go run . |
| greetings: empty name |
| exit status 1 |
| </pre |
| > |
| </li> |
| </ol> |
| |
| <p> |
| That's common error handling in Go: Return an error as a value so the caller |
| can check for it. |
| </p> |
| |
| <p> |
| Next, you'll use a Go slice to return a randomly-selected greeting. |
| </p> |
| |
| <p class="Navigation"> |
| <a class="Navigation-prev" href="/doc/tutorial/call-module-code.html" |
| >< Call your code from another module</a |
| > |
| <a class="Navigation-next" href="/doc/tutorial/random-greeting.html" |
| >Return a random greeting ></a |
| > |
| </p> |