

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Lidando com chamadas limitadas e conexões descartadas
<a name="handling-errors"></a>

Uma operação do Amazon Textract pode falhar se você exceder o número máximo de transações por segundo (TPS), fazendo com que o serviço acelere seu aplicativo ou quando sua conexão cair. Por exemplo, se você fizer muitas chamadas para operações do Amazon Textract em um curto período de tempo, ele acelerará suas chamadas e enviará um`ProvisionedThroughputExceededException`erro na resposta da operação. Para obter informações sobre cotas do Amazon Textract TPS, consulte[Cotas do Amazon Textract](https://docs.aws.amazon.com/general/latest/gr/textract.html). 

Você pode gerenciar a limitação e as conexões descartadas ao tentar automaticamente a operação. Você pode especificar o número de novas tentativas, incluindo o`Config`parâmetro quando você cria o cliente do Amazon Textract. Recomendamos uma contagem de novas tentativas de 5. OAWSO SDK executa uma operação pelo número especificado de novas tentativas para uma operação antes que ocorra falha e seja lançada uma exceção. Para obter mais informações, consulte [Novas tentativas e recuo exponencial na AWS](https://docs.aws.amazon.com/general/latest/gr/api-retries.html).

**nota**  
As tentativas automáticas funcionam para operações síncronas e assíncronas. Antes de especificar novas tentativas automáticas, certifique-se de que você tenha a versão mais recente do AWS SDK. Para obter mais informações, consulte [Etapa 2: Configurar aAWS CLIeAWSSDKs da](setup-awscli-sdk.md).

O exemplo a seguir mostra como realizar novas tentativas de novas tentativas para as operações do Amazon Textract quando você estiver processando vários documentos. 

**Pré-requisitos**
+ Se ainda não tiver feito isso:

  1. Criar ou atualizar um usuário do IAM com`AmazonTextractFullAccess`e`AmazonS3ReadOnlyAccess`Permissões Para obter mais informações, consulte [Etapa 1: Configurar uma conta da AWS e criar um usuário do IAM](setting-up.md#setting-up-iam).

  1. Instale e configure a AWS CLI e os SDKs da AWS. Para obter mais informações, consulte [Etapa 2: Configurar aAWS CLIeAWSSDKs da](setup-awscli-sdk.md).

**Para repetir operações automaticamente**

1. Carregue várias imagens de documento para o bucket do S3 para executar o exemplo síncrono. Carregue um documento de várias páginas para o bucket do S3 e execute`StartDocumentTextDetection`nele para executar o exemplo assíncrono.

   Para obter instruções, consulte[Carregar objetos no Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/UploadingObjectsintoAmazonS3.html)no*Guia do usuário do Amazon Simple Storage Service*.

1. Os exemplos a seguir demonstram como usar o`Config`parâmetro para tentar novamente uma operação automaticamente. O exemplo síncrono chama o`DetectDocumentText`operação, enquanto o exemplo assíncrono chama o`GetDocumentTextDetection`operação. 

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

   Use os exemplos a seguir para chamar o`DetectDocumentText`operação nos documentos no bucket do Amazon S3. Dentro`main`, altere o valor de`bucket`no bucket do S3. Altere o valor de`documents`para os nomes das imagens do documento que você carregou na etapa 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 ]

   Use os exemplos a seguir para chamar a operação `GetDocumentTextDetection`. Ele pressupõe que você já ligou`StartDocumentTextDetection`nos documentos no bucket do Amazon S3 e obteve um`JobId`. Dentro`main`, altere o valor de`bucket`no bucket do S3 e o valor de`roleArn`para o Arn atribuído à sua função Textract. Você também precisará alterar o valor de`document`no nome do documento de várias páginas no bucket do Amazon S3. Finalmente, substitua o valor de`region_name`Fornece o nome da sua região e forneça o`GetResults`função com o nome do seu`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()
   ```

------