Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penanganan kesalahan di Azure SDK untuk C++ terutama diimplementasikan melalui pengecualian C++. Pendekatan ini selaras dengan praktik C++ standar dan memungkinkan pelaporan dan penanganan kesalahan yang jelas di seluruh SDK. Saat aplikasi C++ Anda berinteraksi dengan layanan Azure, operasi dapat gagal karena berbagai alasan seperti masalah autentikasi, tidak tersedianya layanan, permintaan yang tidak valid, atau batasan sumber daya. SDK menangkap kesalahan ini sebagai pengecualian yang memberikan informasi terperinci tentang kegagalan tersebut.
Hierarki pengecualian
Jenis pengecualian inti
Azure SDK untuk C++ menggunakan hierarki kelas pengecualian, dengan yang paling penting adalah:
std::runtime_error- Pengecualian standar C++ dasar dari mana pengecualian khusus Azure diwariskan.Azure::Core::RequestFailedException- Berasal daristd::runtime_error, ini adalah pengecualian dasar untuk semua kegagalan permintaan layanan Azure. Didefinisikan dalamazure/core/exception.hpp, pengecualian ini dilemparkan ketika permintaan ke layanan Azure gagal. Ini menyediakan:- Kode Status HTTP
- Kode kesalahan dari layanan
- Pesan kesalahan
- Meminta ID untuk pemecahan masalah
- Tanggapan HTTP mentah
Azure::Core::OperationCancelledException- Berasal daristd::runtime_error, pengecualian ini dilemparkan ketika operasi dibatalkan, biasanya melalui objek konteks.Azure::Core::Http::TransportException- Berasal dariAzure::Core::RequestFailedException, pengecualian ini dilemparkan ketika ada kesalahan di lapisan transportasi HTTP, seperti kegagalan koneksi.Azure::Core::Credentials::AuthenticationException- Berasal daristd::exception, pengecualian ini dilemparkan ketika autentikasi dengan layanan Azure gagal.
Jenis pengecualian khusus layanan
Layanan Azure yang berbeda memperluas jenis pengecualian dasar untuk memberikan informasi kesalahan khusus layanan:
Azure::Storage::StorageException- MemperluasRequestFailedExceptiondengan informasi khusus penyimpanan lainnya. Pengecualian ini meliputi:- Kode kesalahan khusus penyimpanan
- Informasi tambahan dalam isi respons
- Detail tentang operasi penyimpanan yang gagal
Azure::Messaging::EventHubs::EventHubsException- Pengecualian khusus untuk operasi Azure Event Hubs. Ini termasuk:- Kondisi kesalahan (nilai simbolis dari AMQP (Advanced Message Queuing Protocol))
- Deskripsi kesalahan
- Kode status
- Informasi tentang apakah kesalahan bersifat sementara
Informasi kesalahan pada pengecualian
Kelas RequestFailedException berisi informasi kaya tentang kegagalan layanan:
class RequestFailedException : public std::runtime_error {
public:
// The entire HTTP raw response
std::unique_ptr<Azure::Core::Http::RawResponse> RawResponse;
// The HTTP response code
Azure::Core::Http::HttpStatusCode StatusCode;
// The HTTP reason phrase from the response
std::string ReasonPhrase;
// The client request header (x-ms-client-request-id) from the HTTP response
std::string ClientRequestId;
// The request ID header (x-ms-request-id) from the HTTP response
std::string RequestId;
// The error code from service returned in the HTTP response
std::string ErrorCode;
// The error message from the service returned in the HTTP response
std::string Message;
/* ... constructors and other methods ... */
};
Pengecualian khusus layanan dapat menambahkan bidang tambahan. Misalnya, StorageException menambahkan AdditionalInformation:
struct StorageException final : public Azure::Core::RequestFailedException {
// Some storage-specific information in response body
std::map<std::string, std::string> AdditionalInformation;
/* ... constructors and other methods ... */
};
Pola dan contoh penanganan pengecualian
Menggunakan kode kesalahan
Pengecualian layanan berisi ErrorCode nilai yang dapat digunakan untuk membuat keputusan tentang cara menangani kegagalan. Berikut adalah contoh dengan layanan Penyimpanan:
try {
containerClient.Delete();
}
catch (Azure::Storage::StorageException& e) {
if (e.ErrorCode == "ContainerNotFound") {
// Ignore the error if the container does not exist
}
else {
// Handle other errors here
}
}
Menangani pengecualian dasar
Pola dasar untuk menangani pengecualian di Azure SDK:
try {
// Perform an Azure SDK operation
result = client.SomeOperation();
}
catch (Azure::Core::RequestFailedException const& e) {
std::cout << "Request Failed Exception happened:" << std::endl << e.what() << std::endl;
if (e.RawResponse) {
std::cout << "Error Code: " << e.ErrorCode << std::endl;
std::cout << "Error Message: " << e.Message << std::endl;
}
// Handle or rethrow as appropriate
}
catch (std::exception const& e) {
std::cout << "Other exception: " << e.what() << std::endl;
// Handle general exceptions
}
Menangani kesalahan sementara
Beberapa layanan, seperti Azure Event Hubs, memberikan informasi tentang apakah kesalahan bersifat sementara, memungkinkan logika coba lagi:
try {
// EventHubs operation
}
catch (Azure::Messaging::EventHubs::EventHubsException& e) {
if (e.IsTransient) {
// Retry the operation after a delay
}
else {
// Handle permanent failure
}
}
SDK menerapkan kebijakan percobaan kembali internal untuk kegagalan sementara, tetapi Anda ingin menangani kasus tertentu dalam kode aplikasi Anda.
Penanganan kesalahan khusus layanan
Untuk layanan penyimpanan (Blob, File, Antrean, dll.), Anda dapat menangani kesalahan berdasarkan kode kesalahan dan kode status HTTP:
try {
shareClient.Delete();
}
catch (Azure::Storage::StorageException& e) {
if (e.ErrorCode == "ShareNotFound") {
// Ignore the error if the file share does not exist
}
else if (e.StatusCode == Azure::Core::Http::HttpStatusCode::Conflict) {
// Handle conflict error (e.g., resource in use)
std::cout << "Conflict error: " << e.Message << std::endl;
// Check additional information
for (auto const& info : e.AdditionalInformation) {
std::cout << info.first << ": " << info.second << std::endl;
}
}
else {
// Handle other errors based on status code or error code
std::cout << "Error: " << e.Message << " (Code: " << e.ErrorCode << ")" << std::endl;
}
}
Untuk operasi Key Vault, Anda mungkin perlu menangani pengecualian autentikasi secara terpisah:
try {
// Key Vault operation
}
catch (Azure::Core::Credentials::AuthenticationException const& e) {
std::cout << "Authentication Exception happened:" << std::endl << e.what() << std::endl;
// Handle authentication failure (e.g., invalid credentials)
}
catch (Azure::Core::RequestFailedException const& e) {
std::cout << "Key Vault Client Exception happened:" << std::endl << e.Message << std::endl;
// Handle Key Vault specific errors
}
Pertimbangan keamanan thread
Azure SDK untuk C++ menjamin bahwa metode instans klien aman dan independen satu sama lain. Ini berarti Anda dapat menggunakan instans klien dengan aman di beberapa utas tanpa sinkronisasi.
Saat menangani pengecualian di seluruh utas, perlu diingat:
- Objek exception tidak boleh dibagikan di antara thread kecuali disinkronkan dengan benar
-
RequestFailedExceptiontermasuk konstruktor penyalin yang membuat salinan lengkap, yang dapat digunakan saat perlu meneruskan informasi pengecualian antar utas.