Penanganan kesalahan - AWS SDK for Rust

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

Penanganan kesalahan

Memahami bagaimana dan kapan kesalahan AWS SDK for Rust pengembalian penting untuk membangun aplikasi berkualitas tinggi menggunakan SDK. Bagian berikut menjelaskan berbagai kesalahan yang mungkin Anda temui dari SDK dan cara menanganinya dengan tepat.

Setiap operasi mengembalikan Result tipe dengan jenis kesalahan disetel ke SdkError<E, R = HttpResponse>. SdkErroradalah enum dengan beberapa jenis yang mungkin, yang disebut varian.

Kesalahan layanan

Jenis kesalahan yang paling umum adalah SdkError::ServiceError. Kesalahan ini merupakan respons kesalahan dari file Layanan AWS. Misalnya, jika Anda mencoba mendapatkan objek dari Amazon S3 yang tidak ada, Amazon S3 mengembalikan respons kesalahan.

Ketika Anda menemukan sebuah SdkError::ServiceError itu berarti bahwa permintaan Anda berhasil dikirim ke Layanan AWS tetapi tidak dapat diproses. Ini bisa karena kesalahan dalam parameter permintaan atau karena masalah di sisi layanan.

Detail respons kesalahan disertakan dalam varian kesalahan. Contoh berikut menunjukkan cara mudah mendapatkan ServiceError varian yang mendasarinya dan menangani kasus kesalahan yang berbeda:

// Needed to access the '.code()' function on the error type: use aws_sdk_s3::error::ProvideErrorMetadata; let result = s3.get_object() .bucket("my-bucket") .key("my-key") .send() .await; match result { Ok(_output) => { /* Success. Do something with the output. */ } Err(err) => match err.into_service_error() { GetObjectError::InvalidObjectState(value) => { println!("invalid object state: {:?}", value); } GetObjectError::NoSuchKey(_) => { println!("object didn't exist"); } // err.code() returns the raw error code from the service and can be // used as a last resort for handling unmodeled service errors. err if err.code() == Some("SomeUnmodeledError") => {} err => return Err(err.into()) } };

Metadata kesalahan

Setiap kesalahan layanan memiliki metadata tambahan yang dapat diakses dengan mengimpor sifat khusus layanan.

  • <service>::error::ProvideErrorMetadataSifat ini menyediakan akses ke kode kesalahan mentah yang tersedia dan pesan kesalahan yang dikembalikan dari layanan.

Anda juga bisa mendapatkan informasi yang mungkin berguna saat pemecahan masalah kesalahan layanan:

  • <service>::operation::RequestIdSifat menambahkan metode ekstensi untuk mengambil ID AWS permintaan unik yang dihasilkan oleh layanan.

  • <service>::operation::RequestIdExtSifat menambahkan extended_request_id() metode untuk mendapatkan ID permintaan tambahan yang diperluas.

Pencetakan kesalahan terperinci dengan DisplayErrorContext

Kesalahan dalam SDK umumnya merupakan hasil dari rantai kegagalan seperti:

  1. Mengirim permintaan gagal karena konektor mengembalikan kesalahan.

  2. Konektor mengembalikan kesalahan karena penyedia kredensyal mengembalikan kesalahan.

  3. Penyedia kredensyal mengembalikan kesalahan karena disebut layanan dan layanan itu mengembalikan kesalahan.

  4. Layanan mengembalikan kesalahan karena permintaan kredensyal tidak memiliki otorisasi yang benar.

Secara default, tampilan kesalahan ini hanya menghasilkan “kegagalan pengiriman”. Ini tidak memiliki detail yang membantu memecahkan masalah kesalahan. SDK untuk Rust menyediakan reporter kesalahan sederhana yang disebut. DisplayErrorContext

Saat kami membungkus kesalahan yang akan ditampilkan dan mencetaknya, DisplayErrorContext berikan pesan yang jauh lebih rinci mirip dengan yang berikut ini:

dispatch failure: other: Session token not found or invalid. DispatchFailure( DispatchFailure { source: ConnectorError { kind: Other(None), source: ProviderError( ProviderError { source: ProviderError( ProviderError { source: ServiceError( ServiceError { source: UnauthorizedException( UnauthorizedException { message: Some("Session token not found or invalid"), meta: ErrorMetadata { code: Some("UnauthorizedException"), message: Some("Session token not found or invalid"), extras: Some({"aws_request_id": "1b6d7476-f5ec-4a16-9890-7684ccee7d01"}) } } ), raw: Response { status: StatusCode(401), headers: Headers { headers: { "date": HeaderValue { _private: H0("Thu, 04 Jul 2024 07:41:21 GMT") }, "content-type": HeaderValue { _private: H0("application/json") }, "content-length": HeaderValue { _private: H0("114") }, "access-control-expose-headers": HeaderValue { _private: H0("RequestId") }, "access-control-expose-headers": HeaderValue { _private: H0("x-amzn-RequestId") }, "requestid": HeaderValue { _private: H0("1b6d7476-f5ec-4a16-9890-7684ccee7d01") }, "server": HeaderValue { _private: H0("AWS SSO") }, "x-amzn-requestid": HeaderValue { _private: H0("1b6d7476-f5ec-4a16-9890-7684ccee7d01") } } }, body: SdkBody { inner: Once( Some( b"{ \"message\":\"Session token not found or invalid\", \"__type\":\"com.amazonaws.switchboard.portal#UnauthorizedException\"}" ) ), retryable: true }, extensions: Extensions { extensions_02x: Extensions, extensions_1x: Extensions } } } ) } ) } ), connection: Unknown } } )