Exception handling¶
When using the Python SDK, you should be prepared to handle the following exceptions:
- Any response received by the SDK with a non-2xx HTTP status will be thrown as a
ServiceError
- A
ValueError
will be thrown if you provide invalid parameters to a method call or when setting an attribute. For example:- When setting an attribute on a model and that attribute has a constrained set of values, such as
lifetime
onCreatePublicIpDetails
- When passing a blank string as the identifier for a
get_
operation, such as passing a nilinstance_id
toget_instance()
- When setting an attribute on a model and that attribute has a constrained set of values, such as
ClientError
and its subclasses. These exceptions are raised when there is an error with your configuration file or when using thewait_until()
function- If you use the
UploadManager
then you should also catchMultipartUploadError
- If you use any of the
CompositeOperation
classes in the SDK (e.g.ComputeClientCompositeOperations
) then you should also catchCompositeOperationError
- The Python SDK uses the Requests library to make calls to Oracle Cloud Infrastructure services but it does not mask or wrap any of the errors originating from this library, so you should also account for these in your code. The exception reference for Requests can be found here and here
Handling HTTP 3xx responses¶
As a result of the SDK treating responses with a non-2xx HTTP status as a ServiceError
the SDK will throw a ServiceError
on 3xx responses. This can impact operations which support conditional GETs, such as get_object()
and head_object()
methods as these can return responses with a HTTP status code of 304 if passed an if_none_match
which corresponds to the curent etag of the object or bucket.
In order to account for this, you should catch ServiceError
and check its status
attribute for the HTTP status code. For example:
import oci
config = oci.config.from_file()
client = oci.object_storage.ObjectStorageClient(config)
try:
get_object_response = client.get_object('my_namespace', 'my_bucket', 'my_object', if_none_match='some_etag_value')
except oci.exceptions.ServiceError as e:
if e.status == 304:
# Object exists but has not been modified (based on the etag value)
pass
else:
raise