resdb_driver/exceptions.py (54 lines of code) (raw):

# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. class ResdbException(Exception): """Base exception for all resdb exceptions.""" class ResdbException(Exception): """Base exception for all Resdb exceptions.""" class MissingPrivateKeyError(ResdbException): """Raised if a private key is missing.""" class TransportError(ResdbException): """Base exception for transport related errors. This is mainly for cases where the status code denotes an HTTP error, and for cases in which there was a connection error. """ @property def status_code(self): return self.args[0] @property def error(self): return self.args[1] @property def info(self): return self.args[2] @property def url(self): return self.args[3] class BadRequest(TransportError): """Exception for HTTP 400 errors.""" class NotFoundError(TransportError): """Exception for HTTP 404 errors.""" class ServiceUnavailable(TransportError): """Exception for HTTP 503 errors.""" class GatewayTimeout(TransportError): """Exception for HTTP 503 errors.""" class TimeoutError(ResdbException): """Raised if the request algorithm times out.""" @property def connection_errors(self): """Returns connection errors occurred before timeout expired.""" return self.args[0] HTTP_EXCEPTIONS = { 400: BadRequest, 404: NotFoundError, 503: ServiceUnavailable, 504: GatewayTimeout, } class ResDBError(Exception): """Base class for ResDB exceptions.""" class ConfigurationError(ResDBError): """Raised when there is a problem with server configuration""" class DatabaseAlreadyExists(ResDBError): """Raised when trying to create the database but the db is already there""" class DatabaseDoesNotExist(ResDBError): """Raised when trying to delete the database but the db is not there""" class StartupError(ResDBError): """Raised when there is an error starting up the system""" class CyclicBlockchainError(ResDBError): """Raised when there is a cycle in the blockchain""" class KeypairMismatchException(ResDBError): """Raised if the private key(s) provided for signing don't match any of the current owner(s) """ class OperationError(ResDBError): """Raised when an operation cannot go through""" ############################################################################## # Validation errors # # All validation errors (which are handleable errors, not faults) should # subclass ValidationError. However, where possible they should also have their # own distinct type to differentiate them from other validation errors, # especially for the purposes of testing. class ValidationError(ResDBError): """Raised if there was an error in validation""" class DoubleSpend(ValidationError): """Raised if a double spend is found""" class DoubleSpend(ValidationError): """Raised if a double spend is found""" class InvalidHash(ValidationError): """Raised if there was an error checking the hash for a particular operation """ class InputDoesNotExist(ValidationError): """Raised if a transaction input does not exist""" class SchemaValidationError(ValidationError): """Raised if there was any error validating an object's schema""" class InvalidSignature(ValidationError): """Raised if there was an error checking the signature for a particular operation """ class TransactionNotInValidBlock(ValidationError): """Raised when a transfer transaction is attempting to fulfill the outputs of a transaction that is in an invalid or undecided block """ class AssetIdMismatch(ValidationError): """Raised when multiple transaction inputs related to different assets""" class AmountError(ValidationError): """Raised when there is a problem with a transaction's output amounts""" class InputDoesNotExist(ValidationError): """Raised if a transaction input does not exist""" class TransactionOwnerError(ValidationError): """Raised if a user tries to transfer a transaction they don't own""" class DuplicateTransaction(ValidationError): """Raised if a duplicated transaction is found""" class ThresholdTooDeep(ValidationError): """Raised if threshold condition is too deep""" class GenesisBlockAlreadyExistsError(ValidationError): """Raised when trying to create the already existing genesis block""" class MultipleValidatorOperationError(ValidationError): """Raised when a validator update pending but new request is submited"""