Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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:
std::runtime_error
– Základní standardní výjimka jazyka C++, ze které dědí výjimky specifické pro Azure.Azure::Core::RequestFailedException
– Odvozeno zstd::runtime_error
, toto je základní výjimka pro všechny selhání požadavků služby Azure. Tato výjimka je definována vazure/core/exception.hpp
pří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
Azure::Core::OperationCancelledException
- Odvozeno zstd::runtime_error
, tato výjimka je vyvolána při zrušení operace, obvykle prostřednictvím kontextového objektu.Azure::Core::Http::TransportException
- Odvozeno zAzure::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í.Azure::Core::Credentials::AuthenticationException
– Odvozeno zstd::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:
Azure::Storage::StorageException
- RozšiřujeRequestFailedException
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ě
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:
- Objekty výjimek by neměly být sdíleny mezi vlákny, pokud nejsou správně synchronizované.
- 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.