WSThrows
Defines a list of errors that may be encountered accessing a REST resource.
Syntax
WSThrows = "{ code | code:description | code:@variable } [,...]"
      WSThrows has a comma-separated list of status codes and/or error
        descriptions where:- code is an HTTP status code in the range 400 to 599
 - description is text describing the error
 - @variable is a reference to a variable defined to handle error
            descriptions. The variable must be defined with a 
WSErrorattribute. It is returned in the response message body. 
- There is no space before or after the colon (
:) between code and description. - If you use the code option on its own without a description, the default fault description defined in RFC 2616 is returned to the client.
 
WSThrows is an optional attribute. 
Usage
You use this attribute to manage application level errors, such as a database record not
        found. If your function can potentially return one or more errors, you use
          WSThrows to declare those so that they can be generated in the OpenAPI
        documentation for that resource. 
For instance, HTTP status code 404 means resource not found, but using the
          WSThrows attribute you can respond to the client with 404:user id
          not found in your function. To return a description of the status code like this,
        you must use WSThrows with the
          "code:@variable" option of the attribute, and
        reference a variable with the WSError attribute. 
If you simply need to return an error code without a description, use
          WSThrows with code, or with a description use
          code:description. 
WSThrows:You must use valid HTTP status codes. Codes between 400 to 599 are valid, but use of
            codes between 200 to 399 representing successful HTTP status, results in error-9117.
WSThrows = "404, 402"- In this example, there are no descriptions of the error, just standard HTTP error messages ( see RFC 2616 ) are returned and displayed on the client side.
 WSThrows= "404:not found error, 402:hello world"- In this example, the content after the colon (
:) is the description of the error displayed on the client side. WSThrows= "404:@error1, 402:@error2"- Here error descriptions are provided in the 
WSErrorattributed variables referenced in@error1and@error2.If you need to ensure an error description other than the standard protocol message is returned to the client, you must use
WSThrowswith the "code:@variable" option. Otherwise the web server may replace your description with the standard HTTP error message. 
Example function using WSThrows
In this sample REST function a user resource is updated. The function's
          thisUser parameter of type profileType contains the
        values to update. The thisUser data is passed in the message body in either
        JSON or XML format.
WSThrows attribute is set to handle errors that may be encountered. It
        has options to respond to three HTTP errors:- Error 404 when the resource is not found
 - Error 412 when the server can not respond to the request
 - Error 406 when the server throws an internal error and can not respond to the request
 
TRY/CATCH block, the sqlca record is checked after
        the execution of the SQL query. Depending on the error thrown, error descriptions are
        provided in the WSError attributed variables referenced in
          @userError or @fatalError. A call to SetRestError() returns the
        message defined in WSThrows for the error. IMPORT com  
TYPE profileType RECORD
     id INTEGER,
     name VARCHAR(100),
     email VARCHAR(255)
     # ...
   END RECORD
PUBLIC DEFINE fatalError INTEGER ATTRIBUTES(WSError="fatal error")
PUBLIC DEFINE userError RECORD ATTRIBUTES(WSError = "User error")
  message STRING
END RECORD
PUBLIC FUNCTION updateUser( thisUser profileType )
  ATTRIBUTES (WSPut, 
              WSPath ="/users/update",
              WSDescription ="Update user details",
              WSThrows ="404:@userError,
                         412:@fatalError,
                         406:should not happen" )
  RETURNS STRING
    DEFINE ret STRING
    TRY
      UPDATE users SET 
         name = thisUser.name, 
         email = thisUser.email 
         WHERE id = thisUser.id
         IF sqlca.sqlerrd[3] = 1 THEN  # sqlerrd[3] = processed rows
           LET ret = SFMT("Updated user with ID: %1",thisUser.id)
         ELSE
           LET userError.message = SFMT("No user with ID: %1",thisUser.id)
           CALL com.WebServiceEngine.SetRestError(404,userError)
         END IF
    CATCH
      CASE 
         WHEN sqlca.sqlcode < 0 
            LET fatalError = sqlca.sqlcode
            CALL com.WebServiceEngine.SetRestError(412,fatalError)
         OTHERWISE 
            CALL com.WebServiceEngine.SetRestError(406,NULL)
      END CASE
    END TRY
    RETURN ret
END FUNCTION