Example: handling expected application errors

Error handling is supported with the WSThrows, WSError, and WSErrorHeader attributes.

In your REST function expected errors, such as application level errors, are listed in the WSThrows attribute defined in the ATTRIBUTES clause of the function.

Example using WSError with WSThrows

In this sample REST function there is an example of error handling when a query for a customer specified by id encounters an error. The function has an input parameter id defined as type INTEGER with a WSQuery attribute.

The WSThrows attribute is set in the ATTRIBUTES clause of the function to trap for two HTTP status codes, 404 (Not found) and 400 (bad request). The function also references the "userError" variable (@userError) defined with the WSError attribute to return a description of the error at runtime.

In the example, the module variable userError is a record but you can define this as any suitable Genero BDL simple type.

If an error is encountered in the SQL query, this is handled in the TRY/CATCH block. The WSError attributed variable is set with a specific description of the HTTP status code, and the SetRestError() method is called to return it.

You can define a custom header to return the error response of your web service function. For more details, see WSErrorHeader.

IMPORT com

PUBLIC DEFINE userError RECORD ATTRIBUTES(WSError="User error")
  message STRING
END RECORD

PUBLIC FUNCTION GetCustomersNameById( id STRING ATTRIBUTES(WSQuery) )
  ATTRIBUTES(WSGet,
             WSPath = "/customers",
             WSThrows = "400:@userError")
  RETURNS STRING
    DEFINE s STRING
    TRY
      SELECT lname INTO s FROM customers WHERE @id  = id
      IF sqlca.sqlcode = NOTFOUND THEN
        LET userError.message = SFMT("Could not find customer id :%1",id)
        CALL com.WebServiceEngine.SetRestError(400,userError)
      END IF
    CATCH
      LET userError.message = SFMT(" - SQL error:%1 [%2]",
                                   sqlca.sqlcode, SQLERRMESSAGE)
      CALL com.WebServiceEngine.SetRestError(400,userError)
    END TRY
    RETURN s
END FUNCTION