Aracılığıyla paylaş


C++ için Azure SDK'da hata işleme

C++ için Azure SDK'sında hata işleme öncelikli olarak C++ özel durumları aracılığıyla uygulanır. Bu yaklaşım standart C++ uygulamalarıyla uyumludur ve SDK genelinde net hata raporlama ve işleme olanağı sağlar. C++ uygulamanız Azure hizmetleriyle etkileşime geçtiğinde, kimlik doğrulaması sorunları, hizmetin kullanılamaması, geçersiz istekler veya kaynak kısıtlamaları gibi çeşitli nedenlerle işlemler başarısız olabilir. SDK bu hataları hata hakkında ayrıntılı bilgi sağlayan özel durumlar olarak yakalar.

Özel durum hiyerarşisi

Çekirdek özel durum türleri

C++ için Azure SDK' sı özel durum sınıfları hiyerarşisini kullanır ve en önemlileri şunlardır:

  1. std::runtime_error - Azure'a özgü özel durumların devraldığı temel C++ standart özel durumu.

  2. Azure::Core::RequestFailedException - std::runtime_error'den türetilmiştir. Bu, tüm Azure hizmet isteği hataları için temel istisnadır. içinde azure/core/exception.hpptanımlanan bu özel durum, bir Azure hizmetine yönelik istek başarısız olduğunda oluşturulur. Şunları sağlar:

    • HTTP durum kodu
    • Hizmetten gelen hata kodları
    • Hata iletileri
    • Sorun giderme için kimlik isteme
    • Ham HTTP yanıtı
  3. Azure::Core::OperationCancelledException - std::runtime_error adlı öğeden türetilen bu özel durum, genellikle bir bağlam nesnesi aracılığıyla bir işlem iptal edildiğinde ortaya atılır.

  4. Azure::Core::Http::TransportException - Azure::Core::RequestFailedException'den türetilen bu istisna, bağlantı hataları gibi HTTP aktarım katmanında bir hata meydana geldiğinde ortaya çıkar.

  5. Azure::Core::Credentials::AuthenticationException - std::exception sınıfından türetilmiştir. Bu özel durum, Azure hizmetleriyle kimlik doğrulaması başarısız olduğunda oluşturulur.

Hizmete özgü özel durum türleri

Farklı Azure hizmetleri, hizmete özgü hata bilgileri sağlamak için temel özel durum türlerini genişletir:

  1. Azure::Storage::StorageException - Depolamaya RequestFailedException özgü diğer bilgilerle genişletir. Bu özel durum şunları içerir:

    • Depolamaya özgü hata kodları
    • Yanıt gövdesinde ek bilgiler
    • Başarısız depolama işlemiyle ilgili ayrıntılar
  2. Azure::Messaging::EventHubs::EventHubsException - Event Hubs işlemlerine özgü bir özel durum. İçerik:

    • Hata koşulu (AMQP'den sembolik değer (Gelişmiş İleti Kuyruğa Alma Protokolü))
    • Hata açıklaması
    • Durum kodu
    • Hatanın geçici olup olmadığı hakkında bilgi

Özel durumlarda hata bilgileri

RequestFailedException sınıfı, hizmet hataları hakkında zengin bilgiler içerir:

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 ... */
};

Hizmete özgü özel durumlar ek alanlar ekleyebilir. Örneğin, StorageException ekler 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 ... */
};

Özel durum işleme desenleri ve örnekleri

Hata kodlarını kullanma

Hizmet özel durumları, hataları işleme hakkında karar almak için kullanılabilecek değerler içerir ErrorCode . Depolama hizmetleriyle ilgili bir örnek aşağıda verilmişti:

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
    }
}

Temel özel durumları işleme

Azure SDK'da özel durumları işlemek için temel desen:

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
}

Geçici hataları işleme

Event Hubs gibi bazı hizmetler hatanın geçici olup olmadığı hakkında bilgi sağlayarak yeniden deneme mantığı sağlar:

try {
    // EventHubs operation
}
catch (Azure::Messaging::EventHubs::EventHubsException& e) {
    if (e.IsTransient) {
        // Retry the operation after a delay
    }
    else {
        // Handle permanent failure
    }
}

SDK, geçici hatalar için iç yeniden deneme ilkeleri uygular, ancak uygulama kodunuzda belirli durumları işlemek istiyorsunuz.

Hizmete özgü hata işleme

Depolama hizmetleri (Bloblar, Dosyalar, Kuyruklar vb.) için hataları hem hata kodlarına hem de HTTP durum kodlarına göre işleyebilirsiniz:

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;
    }
}

Key Vault işlemleri için kimlik doğrulama özel durumlarını ayrı ayrı işlemeniz gerekebilir:

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
}

İş parçacığı güvenliğiyle ilgili dikkat edilmesi gerekenler

C++ için Azure SDK, istemci örneği yöntemlerinin iş parçacığı açısından güvenli ve birbirinden bağımsız olduğunu garanti eder. Bu, eşitleme olmadan birden çok iş parçacığında bir istemci örneğini güvenli bir şekilde kullanabileceğiniz anlamına gelir.

İş parçaları arasında özel durumları işlerken şunları aklınızda bulundurun:

  1. Özel durum nesneleri uygun şekilde senkronize edilmediği sürece iş parçacıkları arasında paylaşılmamalıdır.
  2. RequestFailedException derin bir kopya oluşturan ve iş parçacıkları arasında özel durum bilgilerini geçirmek gerektiğinde kullanılabilecek bir kopya oluşturucu içerir.