Error handling¶
All methods from proxy classes return [Munch](https://github.com/Infinidat/munch) with data only when the API call succeeds. Otherwise, an exception is raised.
This example code tries to cancel a build. Such thing is possible only when the build is not already finished.
from copr.v3 import Client
client = Client.create_from_config_file()
try:
build = client.build_proxy.cancel(123)
print("Build {} is {}".format(build.id, build.state))
except CoprRequestException as ex:
print(ex)
In case that the build can be canceled, we get this output.
Build 123 is canceled
Otherwise, an exception is raised and handled.
Cannot cancel build 123
Debugging¶
Sometimes it is useful to dig deeper and examine the failure. Exceptions contain a result
attribute
returning a [Munch](https://github.com/Infinidat/munch) with additional information.
except CoprRequestException as ex:
print(ex)
print(ex.result)
Cannot cancel build 123
Munch({'__response__': <Response [500]>, 'error': u'Cannot cancel build 123'})
The stored response is a standard requests.Reponse
so every possible detail like
status code or headers can be examined.
except CoprRequestException as ex:
print(type(ex.result.__response__))
print(ex.result.__response__)
print(ex.result.__response__.status_code)
print(ex.result.__response__.headers)
<class 'requests.models.Response'>
<Response [500]>
500
{'Date': 'Wed, 25 Jul 2018 21:40:48 GMT', 'Content-Length': '42', 'Content-Type': 'application/json', 'Server': 'Werkzeug/0.12.2 Python/3.6.4'}
Status codes¶
An apropriate status codes are used for specific situations.
Status code |
Reason |
---|---|
200 |
Successful request |
401 |
Unauthorized request when login is required |
403 |
Insufficient permissions, e.g. modifying a project of someone else |
404 |
API endpoint or requested object was not found |
500 |
General frontend error |
Exception hierarchy¶
- exception copr.v3.exceptions.CoprException(msg=None, response=None)[source]¶
Bases:
Exception
Base Copr exception
- exception copr.v3.exceptions.CoprRequestException(msg=None, response=None)[source]¶
Bases:
CoprException
Raised when the API request doesn’t proceed successfully
- exception copr.v3.exceptions.CoprNoResultException(msg=None, response=None)[source]¶
Bases:
CoprException
Raised when no result data is returned
- exception copr.v3.exceptions.CoprTimeoutException(msg=None, response=None)[source]¶
Bases:
CoprException
Raised when the API request timeouted
- exception copr.v3.exceptions.CoprValidationException(msg=None, response=None)[source]¶
Bases:
CoprException
Raised when the data sent from client to API are not valid
- exception copr.v3.exceptions.CoprNoConfigException(msg=None, response=None)[source]¶
Bases:
CoprException
Exception thrown when no config file is found We left this exception in our code because someone can still catch it
- exception copr.v3.exceptions.CoprConfigException(msg=None, response=None)[source]¶
Bases:
CoprException
Exception thrown when the config file is incomplete or malformed.
- exception copr.v3.exceptions.CoprAuthException(msg=None, response=None)[source]¶
Bases:
CoprException
Copr authentication failure