Error Handling¶
In previous versions of Graphene, errors were sent back as protobuf messages. This required the client to read each message and check for an error, and react accordingly.
This has changed in recent versions of Graphene, and this document describes how to use built-in gRPC-level errors.
C# Example¶
To enable the new style gRPC errors, you can add the metadata to any request like this.
try
{
var result = client.CreateNetwork(request);
}
catch (RpcException ex) {
if (ex.StatusCode == StatusCode.InvalidArgument)
{
Console.WriteLine("Invalid arguments: " + ex.ToString());
}
else
{
Console.WriteLine("Something went wrong: " + ex.ToString());
}
}
See the C# gRPC documentiation for a list of possible status codes.
Python Example¶
try:
network = data_api_stub.CreateNetwork(request)
except grpc.RpcError as error:
if error.code() == grpc.StatusCode.INVALID_ARGUMENT:
print(f"Invalid arguments: {error.details()}")
else:
print(f"Something went wrong: {error.details()}")
Handling gRPC-level errors¶
In general, errors fall into one of three categories:
Non-permanent failures
StatusCode.RESOURCE_EXHAUSTED
StatusCode.UNAVAILABLE
Internal errors
StatusCode.INTERNAL
User errors
All others
Although the following code is written in python, the same pattern should be easily adaptable to your programming language of choice.
#!/usr/bin/python3
import logging
import os
from proto.public import data_management_api_pb2, data_management_api_pb2_grpc
import grpc
def my_grpc_call(grpc_channel):
stub = data_management_api_pb2_grpc.DataManagementStub(grpc_channel)
request = data_management_api_pb2.CreateNodeRequest()
try:
response = stub.CreateNode(request)
except grpc.RpcError as e:
if e.code() in (grpc.StatusCode.RESOURCE_EXHAUSTED, grpc.StatusCode.UNAVAILABLE):
# You could automatically retry with some backoff algorithm here, if desired.
print("Graphene is experiencing temporary issues. Please try again later.")
elif e.code() == grpc.StatusCode.UNKNOWN:
# Add custom logic here if you would like to prevent your users getting the generic
# "Contact us at supportanalyzere@verisk.com" message.
print("Error retrieving results from Graphene! Please contact <developer@mycompany.com>.")
else:
# User error. Display the error message to the user so that they can correct their input.
print(f"Error retrieving results from Graphene: {e.code()}: {e.details()}")
Status Code Meanings¶
This section gives a list of status codes used in Graphene today. Please note that this list may grow over time, and therefore you should always include a default way to handle errors that don’t match one of these codes.
gRPC StatusCode |
Meaning |
---|---|
|
Quota limits have been reached and Graphene could not service your request at this time. Trying this same request at a later time may be sucessful. |
|
The service you are calling, or one of its dependencies, is currently unavailable and Graphend could not service your request. Trying this same request at a later time may be sucessful. |
|
An internal error has occurred on Graphene. The development team is notified every time this occurs. This indicates something wrong on our end. |
|
The request is invalid. Note that this differs from
|
|
The request is valid, but something the request depends upon (such as a parquet file) prevents us from servicing the request. |
|
The resource you are requesting was not found. |
|
A feature you are trying to use is not yet implemented. |
|
We don’t have enough detail to determine what caused the error. |