| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 | <?phpnamespace Aws\Exception;use Aws\Api\Shape;use Aws\CommandInterface;use Aws\HasDataTrait;use Aws\HasMonitoringEventsTrait;use Aws\MonitoringEventsInterface;use Aws\ResponseContainerInterface;use Aws\ResultInterface;use JmesPath\Env as JmesPath;use Psr\Http\Message\ResponseInterface;use Psr\Http\Message\RequestInterface;/** * Represents an AWS exception that is thrown when a command fails. */class AwsException extends \RuntimeException implements    MonitoringEventsInterface,    ResponseContainerInterface,    \ArrayAccess{    use HasDataTrait;    use HasMonitoringEventsTrait;    /** @var ResponseInterface */    private $response;    private $request;    private $result;    private $command;    private $requestId;    private $errorType;    private $errorCode;    private $errorShape;    private $connectionError;    private $transferInfo;    private $errorMessage;    private $maxRetriesExceeded;    /**     * @param string           $message Exception message     * @param CommandInterface $command     * @param array            $context Exception context     * @param \Exception       $previous  Previous exception (if any)     */    public function __construct(        $message,        CommandInterface $command,        array $context = [],        \Exception $previous = null    ) {        $this->data = isset($context['body']) ? $context['body'] : [];        $this->command = $command;        $this->response = isset($context['response']) ? $context['response'] : null;        $this->request = isset($context['request']) ? $context['request'] : null;        $this->requestId = isset($context['request_id'])            ? $context['request_id']            : null;        $this->errorType = isset($context['type']) ? $context['type'] : null;        $this->errorCode = isset($context['code']) ? $context['code'] : null;        $this->errorShape = isset($context['error_shape']) ? $context['error_shape'] : null;        $this->connectionError = !empty($context['connection_error']);        $this->result = isset($context['result']) ? $context['result'] : null;        $this->transferInfo = isset($context['transfer_stats'])            ? $context['transfer_stats']            : [];        $this->errorMessage = isset($context['message'])            ? $context['message']            : null;        $this->monitoringEvents = [];        $this->maxRetriesExceeded = false;        parent::__construct($message, 0, $previous);    }    public function __toString()    {        if (!$this->getPrevious()) {            return parent::__toString();        }        // PHP strangely shows the innermost exception first before the outer        // exception message. It also has a default character limit for        // exception message strings such that the "next" exception (this one)        // might not even get shown, causing developers to attempt to catch        // the inner exception instead of the actual exception because they        // can't see the outer exception's __toString output.        return sprintf(            "exception '%s' with message '%s'\n\n%s",            get_class($this),            $this->getMessage(),            parent::__toString()        );    }    /**     * Get the command that was executed.     *     * @return CommandInterface     */    public function getCommand()    {        return $this->command;    }    /**     * Get the concise error message if any.     *     * @return string|null     */    public function getAwsErrorMessage()    {        return $this->errorMessage;    }    /**     * Get the sent HTTP request if any.     *     * @return RequestInterface|null     */    public function getRequest()    {        return $this->request;    }    /**     * Get the received HTTP response if any.     *     * @return ResponseInterface|null     */    public function getResponse()    {        return $this->response;    }    /**     * Get the result of the exception if available     *     * @return ResultInterface|null     */    public function getResult()    {        return $this->result;    }    /**     * Returns true if this is a connection error.     *     * @return bool     */    public function isConnectionError()    {        return $this->connectionError;    }    /**     * If available, gets the HTTP status code of the corresponding response     *     * @return int|null     */    public function getStatusCode()    {        return $this->response ? $this->response->getStatusCode() : null;    }    /**     * Get the request ID of the error. This value is only present if a     * response was received and is not present in the event of a networking     * error.     *     * @return string|null Returns null if no response was received     */    public function getAwsRequestId()    {        return $this->requestId;    }    /**     * Get the AWS error type.     *     * @return string|null Returns null if no response was received     */    public function getAwsErrorType()    {        return $this->errorType;    }    /**     * Get the AWS error code.     *     * @return string|null Returns null if no response was received     */    public function getAwsErrorCode()    {        return $this->errorCode;    }    /**     * Get the AWS error shape.     *     * @return Shape|null Returns null if no response was received     */    public function getAwsErrorShape()    {        return $this->errorShape;    }    /**     * Get all transfer information as an associative array if no $name     * argument is supplied, or gets a specific transfer statistic if     * a $name attribute is supplied (e.g., 'retries_attempted').     *     * @param string $name Name of the transfer stat to retrieve     *     * @return mixed|null|array     */    public function getTransferInfo($name = null)    {        if (!$name) {            return $this->transferInfo;        }        return isset($this->transferInfo[$name])            ? $this->transferInfo[$name]            : null;    }    /**     * Replace the transfer information associated with an exception.     *     * @param array $info     */    public function setTransferInfo(array $info)    {        $this->transferInfo = $info;    }    /**     * Returns whether the max number of retries is exceeded.     *     * @return bool     */    public function isMaxRetriesExceeded()    {        return $this->maxRetriesExceeded;    }    /**     * Sets the flag for max number of retries exceeded.     */    public function setMaxRetriesExceeded()    {        $this->maxRetriesExceeded = true;    }    public function hasKey($name)    {        return isset($this->data[$name]);    }    public function get($key)    {        return $this[$key];    }    public function search($expression)    {        return JmesPath::search($expression, $this->toArray());    }}
 |