Esistono un numero molto piccolo di tipi di eccezione definiti da WinRT e un numero limitato di HRESULT
s che verrà proiettato appositamente in C#.
In generale, l'API modello di progettazione WinRT evita eccezioni per tutto, tranne le cose che sono errori di programmazione e dovrebbe essere scoperti in fase di progettazione (argomenti non validi, le funzionalità mancanti, ecc) o cose che non si può davvero recuperare da (come ad esempio out-of-memory). Dovresti evitare di gestire questi tipi di eccezioni con try
\ catch
perché rappresentano errori nella tua app o incapacità del sistema di continuare a far funzionare la tua app.
Invece, WinRT preferisce avere metodi riusciti ma restituisce oggetti con codici di stato al loro interno (ad esempio, ResponseCode
) che è possibile interrogare per vedere se il metodo è stato completato con successo o meno.
Il ragionamento per questo è che molti sviluppatori non riescono a gestire le eccezioni (a causa di non testare completamente la loro app in diverse configurazioni). Un'eccezione non gestita è garantita per abbattere il processo, che non è una grande esperienza per i clienti, ma un valore di ritorno che indica un errore può essere spesso gestito dalle app, perché già stavano controllando lo stato per altri motivi (es. , probabilmente vuoi sempre controllare lo stato HTTP, se hai o meno un errore) o perché il codice è già resiliente ai risultati "vuoti" (ad esempio, foreach
su un elenco vuoto è ben definito).
Non tutte le API seguono questo schema, specialmente quelle progettate in precedenza in Windows 8, ma è uno schema che si dovrebbe vedere nella maggior parte delle API WinRT. Noterai molte API in stile in WinRT che tentano di fare qualcosa e restituiscono true
o false
invece di lanciare un'eccezione. Quindi, per la maggior parte, il tuo codice dovrebbe essere libero da try
/catch
blocchi intorno alle chiamate API WinRT, anche se potresti ancora aver bisogno di usarli per il tuo codice personale o per le librerie di terze parti.
fonte
2015-01-17 21:53:29
Come gestiresti l'esempio nella domanda? L'unico modo sembra essere l'eccezione generale e ispezionare l'HResult. – tagy22
Sì, questo è l'unico vero modo per gestire le eccezioni che non hanno proiezioni specifiche –
Penso che questa sia una buona risposta, ma penso che sarebbe meglio con un po 'di guida in più - come per il commento di tagy22. Per esempio. pensieri sull'uso di response.IsSuccessStatusCode –