

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Gestión de llamadas limitadas y conexiones interrumpidas
<a name="handling-errors"></a>

Una operación de Amazon Textract Texact puede fallar si supera el número máximo de transacciones por segundo (TPS), lo que hace que el servicio limite la aplicación o cuando se cae la conexión. Por ejemplo, si realiza demasiadas llamadas a operaciones de Amazon Textract Texact en un corto período de tiempo, limita las llamadas y envía un`ProvisionedThroughputExceededException`error en la respuesta de la operación. Para obtener información sobre cuotas de Amazon Textract TPS, consulte[Cuotas de Amazon Textract](https://docs.aws.amazon.com/general/latest/gr/textract.html). 

Puede administrar la limitación y las conexiones caídas si vuelve a intentar automáticamente la operación. Puede especificar el número de reintentos incluyendo el`Config`cuando se crea el cliente de Amazon Textract. Recomendamos un recuento de reintentos de 5. LaAWSEl SDK reintenta una operación la cantidad especificada de veces antes de que se produzca el error y de que se lanza una excepción. Para obtener más información, consulte [Reintentos de error y retardo exponencial en AWS](https://docs.aws.amazon.com/general/latest/gr/api-retries.html).

**nota**  
Los reintentos automáticos funcionan tanto para operaciones síncronas como asíncronas. Antes de especificar reintentos automáticos, asegúrese de que tiene la versión más reciente del SDK de AWS. Para obtener más información, consulte [Paso 2: Configurar laAWS CLIyAWSSDK de](setup-awscli-sdk.md).

En el siguiente ejemplo se muestra cómo reintentar las operaciones de Amazon Textract automáticamente cuando se procesan varios documentos. 

**Requisitos previos**
+ Si aún no lo ha hecho:

  1. Crear o actualizar un usuario de IAM con`AmazonTextractFullAccess`y`AmazonS3ReadOnlyAccess`permisos. Para obtener más información, consulte [Paso 1: Configuración de una cuenta de AWS y creación de un usuario de IAM](setting-up.md#setting-up-iam).

  1. Instale y configure la AWS CLI y los AWS SDK. Para obtener más información, consulte [Paso 2: Configurar laAWS CLIyAWSSDK de](setup-awscli-sdk.md).

**Para reintentar automáticamente las operaciones**

1. Cargue varias imágenes de documento en el bucket de S3 para que se lure el ejemplo sincrónico. Cargue un documento de varias páginas en su bucket de S3 y ejecute`StartDocumentTextDetection`para ejecutar el ejemplo asíncrono.

   Para obtener instrucciones, consulte[Carga de objetos en Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/UploadingObjectsintoAmazonS3.html)en la*Amazon Simple Storage Service User Guide*.

1. En los siguientes ejemplos se muestra cómo utilizar el`Config`para volver a intentar automáticamente una operación. El ejemplo sincrónico llama al`DetectDocumentText`, mientras que el ejemplo asíncrono llama al`GetDocumentTextDetection`. 

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

   Utilice los siguientes ejemplos para llamar al`DetectDocumentText`en los documentos de su bucket de Amazon S3. En`main`, cambie el valor de`bucket`en su bucket de S3. Cambiar el valor de`documents`a los nombres de las imágenes de documento que ha subido en el paso 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 ]

   Utilice los siguientes ejemplos para llamar a la operación `GetDocumentTextDetection`. Supone que ya ha llamado`StartDocumentTextDetection`en los documentos de su bucket de Amazon S3 y obtuvo un`JobId`. En`main`, cambie el valor de`bucket`en su bucket de S3 y el valor de`roleArn`al Arn asignado a su rol Textract. También necesitará cambiar el valor de`document`al nombre del documento de varias páginas del bucket de Amazon S3. Por último, sustituya el valor de`region_name`con el nombre de su región y proporcione el`GetResults`función con el nombre de su`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()
   ```

------