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
ValueErrorwill 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
lifetimeonCreatePublicIpDetails - When passing a blank string as the identifier for a
get_operation, such as passing a nilinstance_idtoget_instance()
- When setting an attribute on a model and that attribute has a constrained set of values, such as
ClientErrorand 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
UploadManagerthen you should also catchMultipartUploadError - If you use any of the
CompositeOperationclasses 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