Se un tipo di runtime di Windows genera un errore COM, .NET sembra capovolgere spesso questo errore (o sempre?) Solo in un'istanza Exception
. Il messaggio di errore include il codice di errore HR HRESULT. Ad esempio, quando si utilizza la nuova API Cryptographic con AES-CBC, una lunghezza del buffer errata risulta in un Exception
con il messaggio "Il buffer utente fornito non è valido per l'operazione richiesta. (Exception from HRESULT: 0x800706F8
)".Come gestire le eccezioni WinRT che risultano in Eccezione?
Bene, come possiamo gestire queste eccezioni? Dovremmo leggere il codice HRESULT
dall'eccezione per avere un'idea del tipo di eccezione che era? Nel classico .NET avrei un CryptographicException
che potrei usare per distinguere gli errori di crittografia da altri errori.
Un'altra cosa che non capisco è che le regole di qualità del codice Microsoft affermano che non si dovrebbero mai lanciare eccezioni ma sempre tipi derivati. Il motivo è che nessuno dovrebbe essere costretto a prendere il generale Exception
che rileva eccezioni più fatali come OutOfMemoryException
. Un'altra regola dice che non si dovrebbe mai, mai catturare Exceptio
n nelle biblioteche. Come possiamo seguire queste politiche se siamo costretti a catturare Exception
nelle app di Windows Store o nelle librerie WinRT?
A proposito: Clemens Vasters shows in his blog how we can catch Exception while avoiding to catch fatal exception. Presumo che catturare Exception
non è più codice cattivo allora.
Per quanto riguarda il post di blog collegato, molte delle eccezioni "fatali" elencate non possono essere rilevate dal codice gestito. In particolare, 'StackOverflowException', anche se sono abbastanza sicuro che non sia possibile catturare anche AV (entrambi possono essere catturati nel codice nativo, ovviamente, ma farlo è pericoloso). Si noti inoltre che alcune eccezioni che _appear_ fatal potrebbero non essere effettivamente così. Ad esempio, molti componenti COM restituiscono 'E_OUTOFMEMORY' quando lo spazio in un determinato buffer viene esaurito. Questo HRESULT sarà tradotto come OutOfMemoryException, ma ciò non significa che il processo abbia esaurito l'intero spazio degli indirizzi. –