<!--{
    "Title": "Return and handle an error",
    "Path":  "/doc/tutorial/handle-errors"
}-->

<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"
    >&lt; Call your code from another module</a
  >
  <a class="Navigation-next" href="/doc/tutorial/random-greeting.html"
    >Return a random greeting &gt;</a
  >
</p>
