Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Greenpeace
L'uso della gestione delle eccezioni
Scritto da Rocco Galati il 02-03-2009 ore 09:41
Intel Cluster Studio XE
A volte succede di scrivere una funzione, che accetti un numero di parametri variabile a seconda del modo con cui viene richiamata nelle varie parti del codice del programma. La soluzione più ovvia, come viene indicato nell'articolo scritto da Vladislav Gelfer, è quella di definire la funzione con tutti i possibili parametri che questa può accettare in modo da prevedere qualsiasi tipo di situazione.

Il problema, in questo caso, è che si richiede più lavoro allo stack e che il codice diventa praticamente impossibile da leggere dovendo usare molte più righe per fornire tutte le istruzioni da eseguire per ogni parametro. Per evitare questa problematica si potrebbero usare le variabili globali, ma ciò porterebbe ad errori causati da funzioni che operano su variabili con valori, i quali cambiano di volta in volta in modo globale durante l'esecuzione dell'applicazione.

Come dice l'autore, un'ottima soluzione consisterebbe nell'utilizzare la gestione delle eccezioni strutturata di Windows. Il codice che segue mostra un esempio dell'uso di queste ultime, nel caso in cui ci sia la necessità di utilizzare un parametro in più.
  1. const DWORD EXCEPTION_FETCHPARAM_B = 0x800A0001L;
  2.  
  3. void Func_Nested(int a)
  4. {
  5.     // do some job. At some situation we realize
  6.  
  7.     // that we need another parameter.
  8.  
  9.     // Let's fetch it.
  10.  
  11.     int b;
  12.  
  13.     ULONG_PTR nExceptionParam = (ULONG_PTR) &b;
  14.     RaiseException(EXCEPTION_FETCHPARAM_B, 0, 1, &nExceptionParam);
  15.  
  16.     // By now 'b' is filled. Continue our work as usual.
  17.  
  18. }
  19.  
  20. void Func_Intermediate(int a)
  21. {
  22.     // do some job. At some point call nested function
  23.  
  24.     Func_Nested(a);
  25. }
  26.  
  27. void Func_Top()
  28. {
  29.     // at this point we have all possible parameters.
  30.  
  31.  
  32.     EXCEPTION_POINTERS* pException;
  33.     __try
  34.     {
  35.         Func_Intermediate(12);
  36.     }
  37.     __except
  38.         (
  39.           pException = GetExceptionInformation(),
  40.           EXCEPTION_FETCHPARAM_B == pException->ExceptionRecord->ExceptionCode ?
  41.            (
  42.              ASSERT(1 == pException->ExceptionRecord->NumberParameters),
  43.              ASSERT(pException->ExceptionRecord->ExceptionInformation[0]),
  44.              *((int*) pException->ExceptionRecord->ExceptionInformation[0]) = 14,
  45.              EXCEPTION_CONTINUE_EXECUTION
  46.            ) :
  47.           EXCEPTION_CONTINUE_SEARCH
  48.         )
  49.     {
  50.         // This point must not be reached,
  51.  
  52.         // since we never return EXCEPTION_EXECUTE_HANDLER
  53.  
  54.     }
  55. }
Precedente: Recuperare e salvare le password di Firefox (1/2)
Successiva: Un tutorial su XUL: i benefici per la personalizzazione (4/25)
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.255 secondi.