cum aflu de unde a fost aruncata o exceptie

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
Post Reply
User avatar
cristitm
Membru
Membru
Posts: 68
Joined: 11 Jul 2007, 21:56

cum aflu de unde a fost aruncata o exceptie

Post by cristitm » 13 Jul 2007, 11:29

Am o applicatie in VC++ si din cand in cand observ in fereastra de output cand rulez in debugger un first-chance exception, care-mi zice ca la adresa cutare a avut loc un std::runtime_exception. Probabil ca exceptia mea e prinsa undeva, dar nu-mi dau seama exact unde e sursa. Pot afla?


Errare human est!

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: cum aflu de unde a fost aruncata o exceptie

Post by Marius Bancila » 13 Jul 2007, 13:32

Chiar ma scris despre asta nu cu mult timp in urma pe blog-ul meu. Daca nu te deranjeaza sa citesti in engleza, arunca o privire aici: http://mariusbancila.ro/blog/?p=41. Daca nu, iti mai explic odata. Practic trebuie sa mergi la dialogul de exceptii, sa adaugi exceptia si sa bifezi la Thrown. Pe blog-ul meu gasesti si poze.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cum aflu de unde a fost aruncata o exceptie

Post by Ovidiu Cucu » 13 Jul 2007, 17:29

Eu am folosit o metoda mai "taraneasca" dar mai directa de localizare rapida a sursei unei exceptii (chair si cand exceptia este raporata de la client, chiar si in build-ul release).
Si anume, folosind macro-urile predefinite __FILE__ si __LINE__ (care dau numele, respectiv linia curenta din fisieul sursa).

Un exemplu (e cu MFC, dar si fara MFC se poate cam la fel iar iddea e aceeasi):

Code: Select all

class CWinException : public CException  
{
   DECLARE_DYNAMIC(CWinException)
public:
   CWinException(DWORD dwError, LPCTSTR pszFile, int nLine);
// ...
};
la care adaug urmatoarele macrouri "ajutatoare":

Code: Select all

#define THROW_WIN32_EXCEPTION { DWORD dwError = ::GetLastError(); \
   CWinException* e = new CWinException(::GetLastError(), __FILE__, __LINE__); \
   THROW(e); }

#define VERIFY_HANDLE(x) if(NULL == x) THROW_WIN32_EXCEPTION
#define VERIFY_BOOL(x) if(!x) THROW_WIN32_EXCEPTION
// ... etc ...
O exceptie poate fi aruncata ca in urmatorul exemplu

Code: Select all

   VERIFY_BOOL(::CreateProcess( . . . ));
Si prinsa ca mai jos

Code: Select all

   TRY
   {
      // ...code here...
   }
   CATCH_ALL(e)
   {
      e->ReportError();
   }
   END_CATCH_ALL
Apare un mesaj clar care descrie clar cauza si care care permite localizarea rapida a locului cu problema chiar stand la taclale la telefon cu clientul :).
Attachments
EXCEPTION.gif
EXCEPTION.gif (9.49 KiB) Viewed 3070 times

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: cum aflu de unde a fost aruncata o exceptie

Post by Dragos Cojocari » 16 Jul 2007, 12:19

Buna metoda, trebuie insa avut grija sa nu ramina pe release. Sunt si clienti fara simtul umorului. :D

Post Reply