Sdílet prostřednictvím


Zpracování chyb v sadě Azure SDK pro C++

Zpracování chyb v sadě Azure SDK pro C++ je primárně implementováno prostřednictvím výjimek jazyka C++. Tento přístup odpovídá standardním postupům jazyka C++ a umožňuje jasné hlášení chyb a zpracování napříč sadou SDK. Když vaše aplikace C++ komunikuje se službami Azure, operace můžou selhat z různých důvodů, jako jsou problémy s ověřováním, nedostupnost služby, neplatné požadavky nebo omezení prostředků. Sada SDK zachycuje tyto chyby jako výjimky, které poskytují podrobné informace o selhání.

Hierarchie výjimek

Základní typy výjimek

Sada Azure SDK pro C++ používá hierarchii tříd výjimek, přičemž nejdůležitější jsou:

  1. std::runtime_error – Základní standardní výjimka jazyka C++, ze které dědí výjimky specifické pro Azure.

  2. Azure::Core::RequestFailedException – Odvozeno z std::runtime_error, toto je základní výjimka pro všechny selhání požadavků služby Azure. Tato výjimka je definována v azure/core/exception.hpppřípadě, že požadavek na službu Azure selže. Poskytuje:

    • Stavový kód HTTP
    • Kódy chyb ze služby
    • Chybové zprávy
    • ID žádostí o řešení potíží
    • Nezpracovaná odpověď HTTP
  3. Azure::Core::OperationCancelledException - Odvozeno z std::runtime_error, tato výjimka je vyvolána při zrušení operace, obvykle prostřednictvím kontextového objektu.

  4. Azure::Core::Http::TransportException - Odvozeno z Azure::Core::RequestFailedException, tato výjimka je vyvolán v případě, že došlo k chybě v přenosové vrstvě HTTP, například selhání připojení.

  5. Azure::Core::Credentials::AuthenticationException – Odvozeno z std::exception, tato výjimka se vyvolá v případě neúspěchu ověřování se službami Azure.

Typy výjimek specifické pro službu

Různé služby Azure rozšiřují základní typy výjimek, aby poskytovaly informace o chybách specifických pro službu:

  1. Azure::Storage::StorageException - Rozšiřuje RequestFailedException o další informace specifické pro úložiště. Tato výjimka zahrnuje:

    • Kódy chyb specifických pro úložiště
    • Další informace v textu odpovědi
    • Podrobnosti o neúspěšné operaci úložiště
  2. Azure::Messaging::EventHubs::EventHubsException – Výjimka specifická pro operace služby Event Hubs. Patří mezi ně:

    • Chybový stav (symbolická hodnota z protokolu AMQP (Advanced Message Queuing Protocol))
    • Popis chyby
    • Stavový kód
    • Informace o tom, jestli je chyba přechodná

Informace o chybách ve výjimkách

Třída RequestFailedException obsahuje bohaté informace o chybách služby:

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

Výjimky specifické pro službu můžou přidávat další pole. Například StorageException přidá 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 ... */
};

Vzory a příklady zpracování výjimek

Použití kódů chyb

Výjimky služby obsahují ErrorCode hodnoty, které je možné použít k rozhodování o způsobu zpracování selhání. Tady je příklad se službami Storage:

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

Zpracování základních výjimek

Základní vzor pro zpracování výjimek v sadě 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
}

Zpracování přechodných chyb

Některé služby, jako je Event Hubs, poskytují informace o tom, jestli je chyba přechodná, což umožňuje logiku opakování:

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

Sada SDK implementuje interní zásady opakování pro přechodné selhání, ale chcete zpracovávat konkrétní případy v kódu aplikace.

Zpracování chyb specifických pro službu

Pro služby úložiště (objekty blob, soubory, fronty atd.) můžete zpracovávat chyby na základě kódů chyb i stavových kódů 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;
    }
}

V případě operací se službou Key Vault možná budete muset zpracovávat výjimky ověřování samostatně:

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
}

Důležité informace o bezpečnosti vláken

Sada Azure SDK pro C++ zaručuje, že metody instance klienta jsou bezpečné pro přístup z více vláken a nezávisle na sobě. To znamená, že můžete bezpečně používat instanci klienta napříč několika vlákny bez synchronizace.

Při zpracování výjimek napříč vlákny mějte na paměti:

  1. Objekty výjimek by neměly být sdíleny mezi vlákny, pokud nejsou správně synchronizované.
  2. Obsahuje RequestFailedException konstruktor kopírování, který vytvoří hloubkovou kopii, kterou je možné použít při předávání informací o výjimce mezi vlákny.