title: How to gracefully handle errors in web service
body: <p>I am writing a simple REST API in go using gin. I have read many posts and texts about making error handling less repetitive in go, but I cannot seem to wrap my mind around how to do it in gin handlers.</p>
  
  <p>All my service does is run some queries against a database and return the results as JSON, so a typical handler looks like this</p>
  
  <pre><code>func DeleteAPI(c *gin.Context) {
      var db = c.MustGet("db").(*sql.DB)
      query := "DELETE FROM table WHERE some condition"
      tx, err := db.Begin()
      if err != nil {
          c.JSON(400, gin.H{"error": err.Error()})
          return
      }
      defer tx.Rollback()
      result, err := tx.Exec(query)
      if err != nil {
          c.JSON(400, gin.H{"error": err.Error()})
          return
      }
      num, err := result.RowsAffected()
      if err != nil {
          c.JSON(400, gin.H{"error": err.Error()})
          return
      }
      err = tx.Commit()
      if err != nil {
          c.JSON(400, gin.H{"error": err.Error()})
          return
      }
      c.JSON(200, gin.H{"deleted": num})
  }
  </code></pre>
  
  <p>As you can see, even this simple handler repeats the same "if err != nil" pattern four times. In a "select" based APIs I have twice as many, since there are potential errors when binding the input data and errors when marshaling the response into JSON. Is there a good way to make this more DRY?</p>