Condividi tramite


Gestione degli errori e valori restituiti

I pacchetti VSPackage e COM usano la stessa architettura per gli errori. Le SetErrorInfo funzioni e GetErrorInfo fanno parte dell'API (Application Programming Interface) Win32. Qualsiasi VSPackage nell'ambiente di sviluppo integrato (IDE) può chiamare queste API Win32 globali per registrare informazioni dettagliate sugli errori durante la ricezione di una notifica di errore. Visual Studio SDK fornisce assembly di interoperabilità per gestire le informazioni sugli errori.

Metodi di interoperabilità

Per praticità, l'IDE fornisce un metodo , SetErrorInfoda usare invece di chiamare le API Win32. Nel codice gestito usare SetErrorInfo. Quando arriva un errore HRESULT a livello in cui deve essere visualizzato il messaggio di errore (spesso l'oggetto che implementa un IOleCommandTarget gestore comandi), l'IDE usa un altro metodo, ReportErrorInfo, per visualizzare la finestra di messaggio appropriata. Nel codice gestito usare il ReportErrorInfo metodo .

Come implementatore VSPackage, gli oggetti COM in genere implementano ISupportErrorInfo. L'interfaccia ISupportErrorInfo garantisce che le informazioni dettagliate sugli errori possano spostarsi verticalmente verso l'alto della catena di chiamate. Gli oggetti che possono essere usati tra processi o tra thread devono supportare ISupportErrorInfo per garantire che le informazioni di errore avanzate vengano sottoposto correttamente al marshalling al chiamante.

Tutti gli oggetti correlati a VSPackage e coinvolti nell'estensione dell'IDE, incluse le factory dell'editor, gli editor, le gerarchie e i servizi offerti, devono supportare informazioni dettagliate sugli errori. Anche se l'IDE non richiede l'implementazione ISupportErrorInfodi questi oggetti VSPackage, è sempre consigliato.

L'IDE è responsabile della segnalazione delle informazioni sugli errori e della relativa visualizzazione a un utente di Visual Studio ogni volta che un oggetto HRESULT viene propagato all'IDE. L'IDE è anche il meccanismo per la creazione di ErrorInfo oggetti.

Linee guida generali

È possibile usare i SetErrorInfo metodi e ReportErrorInfo per impostare e segnalare errori interni all'implementazione del pacchetto VSPackage. Tuttavia, come regola generale, seguire queste linee guida per la gestione dei messaggi di errore nel pacchetto VSPackage:

  • Implementare ISupportErrorInfo negli oggetti COM VSPackage.

  • Creare un meccanismo di segnalazione errori che chiama il SetErrorInfo metodo negli oggetti che implementano IOleCommandTarget.

  • Consentire all'IDE di visualizzare gli errori agli utenti tramite il ReportErrorInfo metodo .

Informazioni sugli errori nell'IDE

Le regole seguenti indicano come gestire le informazioni sugli errori nell'IDE di Visual Studio:

  • Come strategia difensiva per garantire che le informazioni sugli errori non aggiornati non vengano segnalate agli utenti, le funzioni che chiamano il ReportErrorInfo metodo devono prima chiamare il SetErrorInfo metodo . null Passare a cancellare i messaggi di errore memorizzati nella cache prima di chiamare qualsiasi elemento che potrebbe impostare nuove informazioni sull'errore.

  • Le funzioni che non segnalano direttamente i messaggi di errore possono chiamare il SetErrorInfo metodo solo se restituiscono un errore HRESULT. È consentito cancellare l'oggetto ErrorInfo nella voce in una funzione o quando viene restituito S_OK. L'unica eccezione a questa regola è quando una chiamata restituisce un errore HRESULT da cui l'entità ricevente può recuperare o ignorare in modo esplicito.

  • Qualsiasi parte che ignora in modo esplicito un errore HRESULT deve chiamare il SetErrorInfo metodo con S_OK. In caso contrario, l'oggetto ErrorInfo potrebbe essere usato accidentalmente quando un'altra parte genera un errore senza fornire il proprio ErrorInfo.

  • Tutti i metodi che hanno origine un errore HRESULT sono invitati a chiamare il SetErrorInfo metodo per fornire informazioni dettagliate sugli errori. Se l'oggetto restituito HRESULT è un errore speciale FACILITY_ITF , il metodo è necessario per fornire un oggetto appropriato ErrorInfo. Se l'errore restituito è un errore di sistema standard , ad esempio , E_OUTOFMEMORY, E_ABORTE_INVALIDARG, E_UNEXPECTEDe così via, è accettabile restituire il codice di errore senza chiamare in modo esplicito il SetErrorInfo metodo . Come strategia di codifica difensiva, quando si genera un errore HRESULT (inclusi gli errori di sistema), chiamare sempre il SetErrorInfo metodo , descrivendo ErrorInfo l'errore in modo più dettagliato o null.

  • Tutte le funzioni che restituiscono un errore originato da un'altra chiamata devono passare le informazioni ricevute dalla chiamata non riuscita in HRESULT senza modificare l'oggetto ErrorInfo .

Vedi anche