Newsgroup: it.comp.programmare.win32
Titolo: Catturare eccezzioni C

Salve a tutti,
in ambiente win32 + VC6, dato il seguente stralcio di codice:
try {
  char*schiatta = NULL;
  strcpy(schiatta,"ci sarà una eccezzione?")
} catch (...) {
}
In debug entro nel blocco catch!
E' possibile sapere che eccezzione Microzozz ha sollevato?
Vorrei tracciare le informazioni che vedo nel debugInfo (access
violation...first change exception ecc...)
Esiste la possibilità di gestire tali tipologie di errore?
Grazie

Eccezioni!!!!!  meglio una Z in più che una in meno!!!
Ringrazio a chi mi risponderà...

}
Probabilmente non avendo memoria allocata strcpy restituisce
l'eccezione in quanto ritengo non verifica il puntatore .
Per tracciare l'errore dovresi usare la vista CPU del debugger e
districarti nell'assembler .
Comunque ho sottomano il sorgente della strcpy in versione 16 bit .
Se vuoi divertirti , prego :
/*-----------------------------------------------------------------------*
 * filename - strcpy.cas
 *
 * function(s)
 *        strcpy - copy string src to string dest
*-----------------------------------------------------------------------*/
/*
 *      C/C++ Run Time Library - Version 5.0
 *
 *      Copyright (c) 1987, 1992 by Borland International
 *      All Rights Reserved.
 *
 */
#pragma inline
#include <asmrules.h>
#include <string.h>
/*-----------------------------------------------------------------------*
Name            strcpy - copy string src to string dest
Usage           char *strcpy (char *dest, const char *src);
Prototype in    string.h
Description     Copy the ASCIIZ string *src to  the buffer *dest. It
is the
                callers responsibility  to ensure that  the dest
buffer  is
                large enough  to contain the  string, and to  guard
against
                supplying NULL arguments.
Return value    strcpy returns dest.
*------------------------------------------------------------------------*/
#undef strcpy                  /* not an intrinsic */
#if defined(__FARFUNCS__)
#include <_farfunc.h>
#endif
char *_CType _FARFUNC strcpy(char *dest, const char *src)
{
#if !(LDATA)
        _ES = _DS;
#endif
asm     cld
asm     LES_    di, src
asm     mov     si, di
asm     xor     al, al
asm     mov     cx, -1
asm     repne   scasb
asm     not     cx
#if  (LDATA)
#if  !defined(__HUGE__)
asm     push    DS
#endif
        _DS = _ES;
#endif
asm     LES_    di, dest
asm     rep     movsb
#if  defined(__LARGE__) || defined(__COMPACT__)
asm     pop     DS
#endif
        return(dest) ;
}

 
Certamente, dai un occhiata qui:
http://msdn.microsoft.com/library/en-us/debug/base/structured_exception_handling.asp
A prima vista sembra complicato, ma in realta' e' abbastanza semplice da 
usare.
Bye
Guido

 E' possibile sapere che eccezzione Microzozz ha sollevato?
veramente non la solleva Windows, ci pensa l'hardware: dovrebbe trattarsi
di un page fault in quanto la pagina che dovrebbe mappare quell'indirizzo
non esiste; il sistema operativo riceve il page fault e vede che la pagina
non solo non esiste in RAM, ma non esiste nemmeno nel file di swap, e per
questo l'eccezione non viene gestita e va a finire nel tuo catch; per il
resto leggi il link che ti è stato giò dato sulla structured exception
handling in MSDN.
ciao
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it