Error Handling
The errors produced by executing queries can be confusing, containing very Prisma-specific types. For this reason, some utilities and explanation are provided.
Query errors resemble the following:
pub enum Error {
Execute(user_facing_errors::Error),
Serialize(serde_json::Error),
Deserialize(serde_json::Error)
}
Serialize
and Deserialize
errors are fairly self-explanatory, and occur while converting the data returned from Prisma into its appropriate structs.
The serde documentation (opens in a new tab) can be helpful in handling serde errors.
Execute
errors take place when sending a query to the Prisma engines, executing it, and receiving the results. The data contained inside them are an error type provided by Prisma, which contain a lot of deeply nested - and likely not useful - data about the specific error that occurred.
To handle this error type nicely, query errors have an is_prisma_error
function to check if the error is a particular UserFacingError
.
Examples
This example attempts to create a record and checks if a unique key constraint is violated.
use prisma_client_rust::prisma_errors::query_engine::UniqueKeyViolation;
let user = client
.user()
.create(..)
.exec()
.await;
match user {
Ok(user) => println!("User created"),
Err(error) if error.is_prisma_error::<UniqueKeyViolation>() =>
println!("Unique key violated")
Err(error) => println!("Other error occurred")
}
This example attempts to update a record and checks if the record being updated does not exist.
use prisma_client_rust::prisma_errors::query_engine::RecordNotFound;
let user = client
.user()
.update(..)
.exec()
.await;
match user {
Ok(user) => println!("User updated"),
Err(error) if error.is_prisma_error::<RecordNotFound>() =>
println!("User doesn't exist")
Err(error) => println!("Other error occurred")
}