2010-05-18 13 views
5

Nella scrittura del codice C++ Win32, apprezzerei alcuni suggerimenti su come gestire gli errori delle API Win32.Suggerimenti sulla gestione degli errori del codice Win32 C++: AtlThrow contro le eccezioni STL

In particolare, in caso di guasto di una chiamata di funzione Win32 (es MapViewOfFile), è meglio:

  1. uso AtlThrowLastWin32

  2. definire un Win32Exception classe derivata da std :: eccezione, con un membro dati HRESULT aggiunto per memorizzare l'HRESULT corrispondente al valore restituito da GetLastError?

In quest'ultimo caso, potrebbe utilizzare il metodo cosa() per restituire una stringa di errore dettagliato (ad esempio "chiamata MapViewOfFile fallito nel MyClass :: metodo DoSomething().").

Quali sono i pro e i contro di 1 vs 2?

C'è qualche altra opzione migliore che mi manca?

Come nota a margine, se mi piacerebbe localizzare il componente che sto sviluppando, come posso localizzare l'eccezione stringa what()? Stavo pensando di costruire una tabella per mappare la stringa inglese originale restituita da what() in una stringa di errore localizzata Unicode. Qualcuno potrebbe suggerire un approccio migliore?

Grazie mille per i vostri approfondimenti e suggerimenti.

risposta

5

AtlThrow non è molto utile, genera CAtlException che si limita a racchiudere un codice di errore. Avere un errore MapViewOfFile è un problema davvero eccezionale con un codice di errore di basso livello che non dice a te o al tuo utente molto di ciò che effettivamente è andato storto. Gestire l'errore è quasi sempre impossibile, non è probabile che tu possa scrollarlo di dosso e basta non usare un MMF. Dovrai registrare l'errore e terminare il tuo programma con un errore molto generico.

Ottenere molto dettagliato nel tuo messaggio di errore è di solito uno sforzo inutile. "Chiamata MapViewOfFile fallita nel metodo MyClass :: DoSomething()" non significa assolutamente nulla per il tuo utente o il suo staff di supporto. Ottimo per te, qualcosa su cui tracciare l'errore. Ma puoi facilmente automatizzare questo, senza problemi di localizzazione, usando i macro __FILE__ e __LINE__. Tutto ciò di cui hai veramente bisogno per abbinare l'errore al codice sorgente.

Mantenere il messaggio di errore breve e scattante. Per gli errori di Windows, ti consigliamo di utilizzare FormatMessage() per consentire a Windows di generare il messaggio. Sarà localizzato automaticamente, il testo del messaggio è standardizzato e funziona bene. Derivando da std :: exception è ok. Utilizzare gli ID di risorse stringa per i messaggi personalizzati in modo da poterli localizzare facilmente. Risolve anche il problema what().

1

Non si dovrebbero usare eccezioni per la gestione degli errori. Le eccezioni sono eccezionali. Per la gestione degli errori C++, consultare: System error support in C++0x