Error Handling
The Rust client provides the aerospike::errors::Error
type which is used for
all errors returned by the client. The Error
type is a struct containing an
ErrorKind
(which defines the description
and display
methods for the
error), an opaque, optional, boxed std::error::Error + Sync + Send + 'static
object (which defines the cause
, and establishes the links in the error
chain), and a Backtrace
.
ErrorKind
defines the following variants:
Exception | Description |
---|---|
Base64 | Error deserializing a Base64 encoded value. |
InvalidUtf8 | Error deserializing a sequence of u8 into a UTF-8 encoded string. |
Io | Error during an I/O operation. |
MpscRecv | Error returned from the recv function on an MPSC Receiver . |
ParseAddr | Error parsing an IP or socket address. |
ParseInt | Error parsing an integer. |
PwHash | Error returned while hashing a password for user authentication. |
BadResponse | The client received a server response that it was not able to process. |
Connection | The client was not able to communicate with the cluster due to some issue with the network connection. |
InvalidArgument | One or more of the arguments passed to the client are invalid. |
ServerError | The server responded with a response code indicating an error condition. The ResultCode enum lists all possible response codes and their meanings. |
UdfBadResponse | Error returned when executing a User-Defined Function (UDF) resulted in an error. |
For more information on how to use the error chain please refer to the
documentation for external the error_chain
crate, which is used to define the
Error
type: https://docs.rs/error-chain/.
Here is example code that handles an AerospikeException.
#[macro_use] extern crate aerospike;
use aerospike::*;
fn main() {
let hosts = std::env::var("AEROSPIKE_HOSTS").unwrap();
let policy = ClientPolicy::default();
let client = Client::new(&policy, &hosts).expect("Failed to connect to cluster");
let key = as_key!("test", "test", "someKey");
match client.get(&ReadPolicy::default(), &key, Bins::None) {
Ok(record) => {
match record.time_to_live() {
None => println!("record never expires"),
Some(duration) => println!("ttl: {} secs", duration.as_secs()),
}
},
Err(Error(ErrorKind::ServerError(ResultCode::KeyNotFoundError), _)) => {
println!("No such record: {}", key);
},
Err(err) => {
println!("Error fetching record: {}", err);
for err in err.iter().skip(1) {
println!("Caused by: {}", err);
}
// The backtrace is not always generated. Try to run this example
// with `RUST_BACKTRACE=1`.
if let Some(backtrace) = err.backtrace() {
println!("Backtrace: {:?}", backtrace);
}
}
}
}