

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Gestion des appels restreintés et des connexions abandonnées
<a name="handling-errors"></a>

Une opération Amazon Textract peut échouer si vous dépassez le nombre maximal de transactions par seconde (TPS), ce qui entraîne une limitation du service pour votre application ou lorsque votre connexion est interrompue. Par exemple, si vous passez trop d'appels à des opérations Amazon Textract en peu de temps, il limite vos appels et envoie un`ProvisionedThroughputExceededException`erreur dans la réponse de l'opération. Pour obtenir des informations sur les quotas TPS Amazon Textract, veuillez consulter[Quotas Amazon Textract](https://docs.aws.amazon.com/general/latest/gr/textract.html). 

Vous pouvez gérer la limitation et les connexions abandonnées en réessayant automatiquement l'opération. Vous pouvez spécifier le nombre de nouvelles tentatives en incluant le`Config`paramètre lorsque vous créez le client Amazon Textract. Nous recommandons un nombre de nouvelles tentatives de 5. LeAWSLe kit SDK tente à nouveau une opération autant de fois qu'indiqué avant d'échouer et de lever une exception. Pour plus d'informations, consultez la page [Nouvelles tentatives après erreur et interruptions exponentielles dans AWS](https://docs.aws.amazon.com/general/latest/gr/api-retries.html).

**Note**  
Les nouvelles tentatives automatiques fonctionnent à la fois pour les opérations synchrone et asynchrone. Avant de spécifier des tentatives automatiques, assurez-vous que vous disposez de la version la plus récente du kit AWS SDK. Pour plus d'informations, consultez [Étape 2 : Configuration de l'AWS CLIetAWSKits SDK](setup-awscli-sdk.md).

L'exemple suivant montre comment réessayer automatiquement les opérations Amazon Textract lorsque vous traitez plusieurs documents. 

**Prérequis**
+ Si vous ne l'avez pas déjà fait :

  1. Créer ou mettre à jour un utilisateur IAM avec`AmazonTextractFullAccess`et`AmazonS3ReadOnlyAccess`Autorisations. Pour plus d'informations, consultez [Étape 1 : Configuration d'un compte AWS et création d'un utilisateur IAM](setting-up.md#setting-up-iam).

  1. Installez et configurez l'AWS CLI et les kits SDK AWS. Pour plus d'informations, consultez [Étape 2 : Configuration de l'AWS CLIetAWSKits SDK](setup-awscli-sdk.md).

**Pour relancer automatiquement les opérations**

1. Chargez plusieurs images de documents dans votre compartiment S3 pour exécuter l'exemple Synchrone. Chargez un document de plusieurs pages dans votre compartiment S3 et exécutez`StartDocumentTextDetection`dessus pour exécuter l'exemple asynchrone.

   Pour obtenir des instructions, consultez[Chargement d'objets dans Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/UploadingObjectsintoAmazonS3.html)dans le*Guide de l'utilisateur Amazon Simple Storage Service*.

1. Les exemples suivants montrent comment utiliser le`Config`pour relancer automatiquement une opération. L'exemple synchrone appelle le`DetectDocumentText`, tandis que l'exemple asynchrone appelle l'option`GetDocumentTextDetection`. 

------
#### [ Sync Example ]

   Utilisez les exemples suivants pour appeler le`DetectDocumentText`opération sur les documents de votre compartiment Amazon S3. Dans`main`, modifiez la valeur de`bucket`dans votre compartiment S3. Modifiez la valeur de`documents`aux noms des images de document que vous avez téléchargées à l'étape 2.

   ```
   import boto3
   from botocore.client import Config
   # Documents
   
   def process_multiple_documents(bucket, documents):
       
       config = Config(retries = dict(max_attempts = 5))
    
       # Amazon Textract client
       textract = boto3.client('textract', config=config)
    
       for documentName in documents:
    
           print("\nProcessing: {}\n==========================================".format(documentName))
    
           # Call Amazon Textract
           response = textract.detect_document_text(
               Document={
                   'S3Object': {
                       'Bucket': bucket,
                       'Name': documentName
                   }
               })
    
           # Print detected text
           for item in response["Blocks"]:
               if item["BlockType"] == "LINE":
                   print ('\033[94m' +  item["Text"] + '\033[0m')
   
   
   def main():
       bucket = ""
       documents = ["document-image-1.png",
       "document-image-2.png", "document-image-3.png",
       "document-image-4.png", "document-image-5.png" ]
       process_multiple_documents(bucket, documents)
   
   
   
   if __name__ == "__main__":
       main()
   ```

------
#### [ Async Example ]

   Utilisez les exemples suivants pour appeler l'opération `GetDocumentTextDetection`. Il suppose que vous avez déjà appelé`StartDocumentTextDetection`sur les documents de votre compartiment Amazon S3 et obtenu un`JobId`. Dans`main`, modifiez la valeur de`bucket`à votre compartiment S3 et à la valeur de`roleArn`à l'arn affecté à votre rôle Textract. Vous devez également modifier la valeur de`document`au nom de votre document multi-pages dans votre compartiment Amazon S3. Enfin, remplacez la valeur de`region_name`avec le nom de votre région et fournissez le`GetResults`avec le nom de votre`jobId`.

   ```
   import boto3
   from botocore.client import Config
   
   class DocumentProcessor:
       jobId = ''
       region_name = ''
   
       roleArn = ''
       bucket = ''
       document = ''
   
       sqsQueueUrl = ''
       snsTopicArn = ''
       processType = ''
   
       def __init__(self, role, bucket, document, region):
           self.roleArn = role
           self.bucket = bucket
           self.document = document
           self.region_name = region
           self.config = Config(retries = dict(max_attempts = 5))
   
           self.textract = boto3.client('textract', region_name=self.region_name, config=self.config)
           self.sqs = boto3.client('sqs')
           self.sns = boto3.client('sns')
   
   # Display information about a block
       def DisplayBlockInfo(self, block):
   
           print("Block Id: " + block['Id'])
           print("Type: " + block['BlockType'])
           if 'EntityTypes' in block:
               print('EntityTypes: {}'.format(block['EntityTypes']))
   
           if 'Text' in block:
               print("Text: " + block['Text'])
   
           if block['BlockType'] != 'PAGE':
               print("Confidence: " + "{:.2f}".format(block['Confidence']) + "%")
   
           print('Page: {}'.format(block['Page']))
   
           if block['BlockType'] == 'CELL':
               print('Cell Information')
               print('\tColumn: {} '.format(block['ColumnIndex']))
               print('\tRow: {}'.format(block['RowIndex']))
               print('\tColumn span: {} '.format(block['ColumnSpan']))
               print('\tRow span: {}'.format(block['RowSpan']))
   
               if 'Relationships' in block:
                   print('\tRelationships: {}'.format(block['Relationships']))
   
           print('Geometry')
           print('\tBounding Box: {}'.format(block['Geometry']['BoundingBox']))
           print('\tPolygon: {}'.format(block['Geometry']['Polygon']))
   
           if block['BlockType'] == 'SELECTION_ELEMENT':
               print('    Selection element detected: ', end='')
               if block['SelectionStatus'] == 'SELECTED':
                   print('Selected')
               else:
                   print('Not selected')
   
       def GetResults(self, jobId):
           maxResults = 1000
           paginationToken = None
           finished = False
   
           while finished == False:
   
               response = None
   
               if paginationToken == None:
                   response = self.textract.get_document_text_detection(JobId=jobId,
                                                                            MaxResults=maxResults)
               else:
                   response = self.textract.get_document_text_detection(JobId=jobId,
                                                                            MaxResults=maxResults,
                                                                            NextToken=paginationToken)
   
               blocks = response['Blocks']
               print('Detected Document Text')
               print('Pages: {}'.format(response['DocumentMetadata']['Pages']))
   
               # Display block information
               for block in blocks:
                   self.DisplayBlockInfo(block)
                   print()
                   print()
   
               if 'NextToken' in response:
                   paginationToken = response['NextToken']
               else:
                   finished = True
   
   def main():
       roleArn = 'role-arn'
       bucket = 'bucket-name'
       document = 'document-name'
       region_name = 'region-name'
       analyzer = DocumentProcessor(roleArn, bucket, document, region_name)
       analyzer.GetResults("job-id")
   
   if __name__ == "__main__":
       main()
   ```

------