2013-01-16 16 views
9

Sto migrando da WindowsAzure.StorageClient 1.7 a WindowsAzure.Storage 2.0 e sto lavorando proprio ora sulla gestione delle eccezioni. A seguito di questa guide e da altre fonti, ho scoperto di avere a migrare daWindowsAzure.Storage v2 StorageException

try 
{ 
    // Something 
} 
catch (StorageClientException e) 
{ 
    switch (e.ErrorCode) 
    { 
     case StorageErrorCode.ContainerNotFound: 
     case StorageErrorCode.ResourceNotFound: 
     case StorageErrorCode.BlobNotFound: 
     case StorageErrorCode.ConditionFailed: 
      // Do something 
    } 
} 

a

try 
{ 
    // Something 
} 
catch (StorageException e) 
{ 
    switch (e.RequestInformation.ExtendedErrorInformation.ErrorCode) 
    { 
     case StorageErrorCodeStrings.ContainerNotFound: 
     case StorageErrorCodeStrings.ResourceNotFound: 
     case BlobErrorCodeStrings.BlobNotFound: 
     case StorageErrorCodeStrings.ConditionNotMet: 
      // Do something 
    } 
} 

sembra semplice. Il problema è ExtendedErrorInformation è sempre uguale a null. HttpStatusMessage invece dice "Il blob specificato non esiste.", Come dovrebbe.

Ho pensato che fosse causato dal simulatore dell'ambiente di test, ma provarlo in un ambiente Azure reale mi ha portato alla stessa situazione.

Qualche idea?

+0

In base alla documentazione, non è possibile fare affidamento sull'Extended Error Information per il codice logi c - http://msdn.microsoft.com/en-us/library/windows/desktop/aa375374%28v=vs.85%29.aspx –

+0

@RussCam il collegamento sembra essere relativo a RPC, non all'API del client di archiviazione. – fsimonazzi

risposta

3

Ho appena provato e sono stato sorpreso di vedere che in effetti l'oggetto ExtendedErrorInformation è nullo. Tuttavia non è sempre nullo. Ad esempio, se provo a creare un contenitore BLOB che esiste già utilizzando il metodo blobContainer.Create(), otterrò un ExtendedErrorInformation non null. Tuttavia, se provo a recuperare gli attributi di un BLOB che non esiste nel contenitore BLOB, otterrò un oggetto ExtendedErrorInformation null. Immagino che non si possa semplicemente supporre che l'oggetto ExtendedErrorInformation sarà sempre disponibile.

Inoltre, ho notato che nel codice per 2.0 si utilizza StorageErrorCodeStrings. Si noti che è stato rimosso dalla versione 2.0 ed è disponibile solo con la versione 1.8 o precedente. Ho pensato di menzionare che

Aggiornamento: Si prega di consultare il commento qui sotto da @VollmonD. Questo è stato aggiunto nella versione 2.0.3.

+1

StorageErrorCodeStrings è stato aggiunto in 2.0.3, ho ottenuto i pacchetti via nuget. Il FetchAttributes è una delle situazioni in cui ho avuto il problema. Ora sto cercando di vedere se posso usare le stringhe del codice di errore per ottenere il messaggio di errore e confrontarlo con HttpStatus. Grazie per il tuo post di blog, mi ha aiutato molto durante questi giorni di migrazione :) –

+0

Il mio male! Non sapevo che il team di archiviazione lo includesse. Devo tornare indietro e aggiornare il post sulla gestione delle eccezioni :). Sono contento che ti siano piaciuti i miei post sul blog. –

6

Un'altra opzione è quella di guardare allo RequestInformation.HttpStatusCode. Questo sembra essere più affidabile comunque. Il tuo codice si traduce piuttosto facilmente a:

try 
{ 
    // Something 
} 
catch (StorageException e) 
{ 
    switch (e.RequestInformation.HttpStatusCode) 
    { 
     case (int)HttpStatusCode.NotFound: 
     case (int)HttpStatusCode.PreconditionFailed: 
     // Do something 
    } 
} 
+0

Sì, sapevo che il codice di stato, ma è troppo generico per i miei scopi. Avevo bisogno del "potere" dato dalle stringhe del codice di errore di Azure, per intraprendere azioni diverse. Sono riuscito a prendere la stringa da HttpStatusMessage e confrontarla con quelle di Azure per restituire il codice. @Gaurav nell'altra risposta era corretta, il problema è solo con FetchAttributes, per quello che ho visto. –

0

in ritardo alla festa, ma se si sta cercando di gestire l'eliminazione di elementi dal blob o semplicemente controllando se esistenti (metodo di estensione un po approccio). ora è possibile utilizzare:

Controllare qui per un elenco dei metodi su CloudBlob: https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.aspx