

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Penanganan Throttled Call dan Dropped Connections
<a name="handling-errors"></a>

Operasi Amazon Textract Texact dapat gagal jika Anda melebihi jumlah maksimum transaksi per detik (TPS), yang menyebabkan layanan untuk throttle aplikasi Anda, atau ketika koneksi Anda turun. Misalnya, jika Anda membuat terlalu banyak panggilan ke operasi Amazon Texact dalam waktu singkat, panggilan akan mengurangi panggilan Anda dan mengirim`ProvisionedThroughputExceededException`kesalahan dalam respon operasi. Untuk informasi selengkapnya tentang kuota Amazon Textract TPS, lihat[Amazon Textract](https://docs.aws.amazon.com/general/latest/gr/textract.html). 

Anda dapat mengelola throttling dan drop koneksi dengan secara otomatis mencoba kembali operasi. Anda dapat menentukan jumlah retries dengan memasukkan`Config`parameter saat Anda membuat klien Amazon Textract. Kami merekomendasikan hitungan coba lagi dari 5. ParameterAWSSDK mencoba ulang operasi jumlah tertentu kali sebelum gagal dan melempar pengecualian. Untuk informasi selengkapnya, lihat[Pengulangan Kesalahan dan Backoff Eksponensial di AWS](https://docs.aws.amazon.com/general/latest/gr/api-retries.html).

**catatan**  
Coba ulang otomatis bekerja untuk operasi sinkron dan asinkron. Sebelum menentukan percobaan ulang otomatis, pastikan Anda memiliki SDK AWS versi terbaru. Untuk informasi selengkapnya, lihat [Langkah 2: MenyiapkanAWS CLIdanAWSSDK](setup-awscli-sdk.md).

Contoh berikut menunjukkan cara mencoba ulang operasi Amazon Textract secara otomatis saat Anda memproses beberapa dokumen. 

**Prasyarat**
+ Jika belum:

  1. Buat atau perbarui pengguna IAM dengan izin `AmazonTextractFullAccess` dan `AmazonS3ReadOnlyAccess`. Untuk informasi selengkapnya, lihat [Langkah 1: Siapkan Akun AWS dan Buat Pengguna IAM](setting-up.md#setting-up-iam).

  1. Instal dan konfigurasikan SDK AWS CLI dan AWS. Untuk informasi selengkapnya, lihat [Langkah 2: MenyiapkanAWS CLIdanAWSSDK](setup-awscli-sdk.md).

**Untuk secara otomatis mencoba lagi operasi**

1. Unggah beberapa gambar dokumen ke bucket S3 Anda untuk menjalankan contoh Synchronous. Unggah dokumen multi-halaman ke bucket S3 Anda dan jalankan`StartDocumentTextDetection`di atasnya untuk menjalankan contoh Asynchronous.

   Untuk instruksi, lihat[Mengunggah Objek ke Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/UploadingObjectsintoAmazonS3.html)di dalam*Panduan Pengguna Amazon Simple Storage*.

1. Contoh-contoh berikut ini menunjukkan cara menggunakan`Config`parameter untuk secara otomatis mencoba lagi operasi. Contoh Synchronous memanggil`DetectDocumentText`operasi, sedangkan contoh Asynchronous memanggil`GetDocumentTextDetection`operasi. 

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

   Gunakan contoh berikut untuk memanggil`DetectDocumentText`operasi pada dokumen dalam bucket Amazon S3. Masuk`main`, mengubah nilai`bucket`ke bucket S3 Anda. Ubah nilai`documents`untuk nama-nama gambar dokumen yang Anda upload pada langkah 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 ]

   Gunakan contoh berikut untuk memanggil operasi `GetDocumentTextDetection`. Ini mengasumsikan Anda telah menelepon`StartDocumentTextDetection`pada dokumen di bucket Amazon S3 dan memperoleh`JobId`. Masuk`main`, mengubah nilai`bucket`bucket S3 Anda dan nilai`roleArn`ke Arn ditugaskan untuk peran Textract Anda. Anda juga harus mengubah nilai`document`dengan nama dokumen multi-halaman di bucket Amazon S3. Akhirnya, ganti nilai`region_name`dengan nama wilayah Anda dan memberikan`GetResults`berfungsi dengan nama`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()
   ```

------