# Exception handling

This page explains how payment senders can validate payments against their receiving partner's RPO schema, and generate "instructed" business exceptions.

<!-- -->
The Test Harness generates instructed exceptions in "Sending Test" mode only (as mock receiver).

## Instructed exceptions

There are three types of RippleNet exceptions:

* **Instructed**: exceptions created by the member who controls the payment.
* **Asynchronous**: exceptions created by *other* members who control the payment, as well as RippleNet internal exceptions.
* **Synchronous**: RippleNet HTTP error in response to an API request.


## RPO validation

Schema violations trigger a payment failure. Each schema violation is mapped to an error code defined in the `errorMapFilename` property; and each error code is added to the payments failure reasons.

Caution
Accepted payments are only processed by the mock receiver Test Harness if the `user_info` is in the form of a JSON object. If the `user_info` is an array (as allowed by the RippleNet API), the payment is ignored.

## Triggering exceptions

Exceptions are generated in two ways:

* If the inbound RPO doesn't align with the active RPO schema, the payment fails with a "RECEIVER_DATA_VALIDATION" failure type and an error code determined by the error mapping file.
* If the inbound RPO contains the "instructed_failure" key, the payment fails with both the failure type and an error code determined by the error mapping file.


To trigger an instructed business exception, add a field called `instructed_failure` to the `user_info` during the Accept quote step. Set the value of this field to `failure_type`-`failure_code` (that is, type + hyphen + code), for example:


```json
	{
		"instructed_failure": "RECEIVER_DATA_VALIDATION-AC01"
	}
```

## Failure types and codes

The Test Harness supports all *receiver* failure types: `RECEIVER_DATA_VALIDATION`, `RECEIVER_LOCK_FAILURE`, and `RECEIVER_PROCESSING_ERROR`. The failure type determines the stage at which the payment is failed.

### Sender return requests

For returns processed by the receiver, the primary failure type is `RECEIVER_PROCESSING_ERROR`. With RippleNet Test Harness 1.6.0 and higher, you can use `SENDER_RETURN` for returns performed based on a request from the payment sender.