Hibakezelés az Azure SDK for C++ alkalmazásban

Az Azure SDK for C++ hibakezelése elsősorban C++ kivételekkel történik. Ez a megközelítés összhangban van a szokásos C++ eljárásokkal, és lehetővé teszi a hibák egyértelmű jelentését és kezelését az SDK-ban. Amikor a C++ alkalmazás együttműködik az Azure-szolgáltatásokkal, a műveletek különböző okokból meghiúsulhatnak, például hitelesítési problémák, a szolgáltatás elérhetetlensége, érvénytelen kérések vagy erőforrás-korlátozások miatt. Az SDK kivételként rögzíti ezeket a hibákat, amelyek részletes információkat nyújtanak a hibáról.

Kivételhierarchia

Alapvető kivételtípusok

Az Azure SDK for C++ kivételosztályok hierarchiáját használja, a legfontosabbak a következőek:

  1. std::runtime_error - Az alap C++ standard kivétel, amelyből az Azure-specifikus kivételek öröklődnek.

  2. Azure::Core::RequestFailedException – A std::runtime_error által származtatott, ez az alapkivétel az összes Azure szolgáltatáskérelem meghibásodására. Ez a azure/core/exception.hppkivétel akkor jelenik meg, ha egy Azure-szolgáltatásra irányuló kérés meghiúsul. A következő lehetőségeket biztosítja:

    • HTTP-állapotkód
    • Hibakódok a szolgáltatásból
    • Hibaüzenetek
    • Azonosítók kérése hibaelhárításhoz
    • A nyers HTTP-válasz
  3. Azure::Core::OperationCancelledException – Ez a std::runtime_errorkivétel a művelet megszakításakor keletkezik, általában egy környezeti objektumon keresztül.

  4. Azure::Core::Http::TransportException - Ebből Azure::Core::RequestFailedExceptionszármazik, ez a kivétel akkor jelenik meg, ha hiba van a HTTP átviteli rétegben, például csatlakozási hibák.

  5. Azure::Core::Credentials::AuthenticationException – Ez a std::exceptionkivétel akkor jelenik meg, ha az Azure-szolgáltatásokkal való hitelesítés sikertelen.

Szolgáltatásspecifikus kivételtípusok

A különböző Azure-szolgáltatások kibővítik az alapkivétel-típusokat, hogy szolgáltatásspecifikus hibainformációkat nyújtsanak:

  1. Azure::Storage::StorageException – Más tárolóspecifikus információkkal bővíthető RequestFailedException . Ez a kivétel a következőket tartalmazza:

    • Tárolóspecifikus hibakódok
    • További információk a választestben
    • A sikertelen tárolási művelet részletei
  2. Azure::Messaging::EventHubs::EventHubsException – Az Event Hubs-műveletekre vonatkozó kivétel. A tartalma:

    • Hibafeltétel (az Advanced Message Queuing Protocol (AMQP) szimbolikus értéke)
    • Hiba leírása
    • Állapotkód
    • Információ arról, hogy a hiba átmeneti-e

Hibainformációk kivételekben

Az RequestFailedException osztály részletes információkat tartalmaz a szolgáltatáshibákról:

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

A szolgáltatásspecifikus kivételek további mezőket adhatnak hozzá. Például a StorageException következőt adja AdditionalInformationhozzá:

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

Kivételkezelési minták és példák

Hibakódok használata

A szolgáltatáskivételek olyan értékeket tartalmaznak ErrorCode , amelyekkel döntéseket hozhat a hibák kezeléséről. Íme egy példa a Storage-szolgáltatásokra:

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

Alapvető kivételek kezelése

Az Azure SDK-ban a kivételek kezelésére szolgáló alapszintű minta:

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
}

Átmeneti hibák kezelése

Egyes szolgáltatások, például az Event Hubs, információt nyújtanak arról, hogy egy hiba átmeneti-e, és lehetővé teszi az újrapróbálkozási logikát:

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

Az SDK belső újrapróbálkozási szabályzatokat implementál az átmeneti hibákhoz, de előfordulhat, hogy az alkalmazáskód adott eseteit szeretné kezelni.

Szolgáltatásspecifikus hibakezelés

Az olyan tárolási szolgáltatások esetében, mint a blobok, fájlok és üzenetsorok, hibakódok és HTTP-állapotkódok alapján is kezelheti a hibákat:

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

A Key Vault-műveletek esetében előfordulhat, hogy külön kell kezelnie a hitelesítési kivételeket:

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
}

Szálbiztonsági szempontok

Az Azure SDK for C++ garantálja, hogy az ügyfélpéldány-metódusok szálbiztosak és függetlenek egymástól. Ez azt jelenti, hogy egy ügyfélpéldányt biztonságosan használhat több szálon szinkronizálás nélkül.

A szálak közötti kivételek kezelésekor vegye figyelembe a következőket:

  1. A kivételobjektumokat csak akkor szabad megosztani a szálak között, ha megfelelően szinkronizálják
  2. Ez RequestFailedException magában foglal egy másolatkonstruktort, amely létrehoz egy mély másolatot, amely akkor használható, ha kivételadatokat kell átadni a szálak között