Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
std::runtime_error- Az alap C++ standard kivétel, amelyből az Azure-specifikus kivételek öröklődnek.Azure::Core::RequestFailedException– Astd::runtime_erroráltal származtatott, ez az alapkivétel az összes Azure szolgáltatáskérelem meghibásodására. Ez aazure/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
Azure::Core::OperationCancelledException– Ez astd::runtime_errorkivétel a művelet megszakításakor keletkezik, általában egy környezeti objektumon keresztül.Azure::Core::Http::TransportException- EbbőlAzure::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.Azure::Core::Credentials::AuthenticationException– Ez astd::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:
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
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:
- A kivételobjektumokat csak akkor szabad megosztani a szálak között, ha megfelelően szinkronizálják
- Ez
RequestFailedExceptionmagá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