Error handling
S3 Transfer Manager uses promises for asynchronous operations. You can handle errors using the
promise's otherwise or then method. You can also wrap your
implementation in a try-catch block.
Promise error handling
Using otherwise:
<?php use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager(null, []); $uploadPromise = $transferManager->upload( new UploadRequest( '/path/to/file.txt', [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'file.txt', ] ) ); $uploadPromise->otherwise(function (Throwable $reason) { echo "Upload failed: " . $reason->getMessage() . "\n"; });
Using then:
<?php use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Models\UploadResult; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager(null, []); $uploadPromise = $transferManager->upload( new UploadRequest( '/path/to/file.txt', [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'file.txt', ] ) ); $uploadPromise->then( function (UploadResult $result) { echo "Upload succeeded!\n"; }, function (Throwable $error) { echo "Upload failed: " . $error->getMessage() . "\n"; } )->wait();
Using try-catch block
<?php use Aws\S3\S3Transfer\Exception\S3TransferException; use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager(null, []); $uploadPromise = $transferManager->upload( new UploadRequest( '/path/to/file.txt', [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'file.txt', ] ) ); try { $uploadPromise->wait(); } catch (S3TransferException $exception) { echo "Upload failed: " . $exception->getMessage() . "\n"; }
<Add more details about S3TransferManager exception and also a
link to the API reference for it.>
Directory operation failure policies
For directory operations, you can also specify a failure policy callback. This callback handles failures for individual files and decides whether the directory upload should continue.
Example of using a 'failure_policy' function for uploadDirectory
operation
<?php use Aws\S3\S3Transfer\Models\UploadDirectoryRequest; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager(null, []); $uploadDirPromise = $transferManager->uploadDirectory( new UploadDirectoryRequest( '/path/to/directory', 'amzn-s3-demo-bucket', [], [ 'failure_policy' => function ( $requestArgs, $uploadDirectoryRequestArgs, $reason, $uploadDirectoryResponse ) { echo "Failed to upload {$requestArgs['Key']}: " . "{$reason->getMessage()}\n"; echo "So far, uploaded: " . "{$uploadDirectoryResponse->getObjectsUploaded()}, " . "failed: {$uploadDirectoryResponse->getObjectsFailed()}\n"; // Return true to continue with other files, // or throw an exception to abort. return true; }, ] ) ); $uploadDirPromise->wait();
Example of using a 'failure_policy' function for downloadDirectory
operation
<?php use Aws\S3\S3Transfer\Models\DownloadDirectoryRequest; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager(null, []); // Log errors but continue with other files. $downloadDirPromise = $transferManager->downloadDirectory( new DownloadDirectoryRequest( 'amzn-s3-demo-bucket', '/path/to/directory', [], [ 'failure_policy' => function ( $requestArgs, $downloadDirectoryRequestArgs, $reason, $downloadDirectoryResponse ) { error_log("Failed to download {$requestArgs['Key']}: " . "{$reason->getMessage()}"); // If we've had too many failures, abort the entire operation. if ($downloadDirectoryResponse->getObjectsFailed() > 10) { throw new \Exception( "Too many download failures, aborting operation" ); } // Return void to continue with other files. return; }, ] ) ); $downloadDirPromise->wait();