Newsgroup: it.comp.lang.delphi
Titolo: Intercettare Out Of Memory

Mi sto perdendo in un bicchiere d'acqua!
 
var
  myArray: array of array of int64;
begin
  { leggo dati inseriti da utente }
  try
    setlength(myArray, row, column);
  except
    on E: Exception do showmessage(E.Message);
  end;
[...]
end;
 
Se si solleva un Range check error Try lo segnala correttamente, se i dati 
passati rientrano nel range ma si solleva un Out of Memory l'applicazione lo 
visualizza senza per� passare per Try...
Insomma non riesco ad intercettarlo per poi gestirlo...
Ho provato anche con EOutOfMemory ma stessa cosa.
Suggerimenti?
 
Valter
 
 


 
Credo si debba assegnare prima un valore a row e column senno chissa' 
cosa vale, giorgio

 vale, giorgio
 
Ciao Giorgio, se non mi sfugge qualcosa lo faccio...
 
l'utente inserisce dei dati ed io li leggo
quando inizializzo setlength(myArray, row, column) sia row che column sono 
assegnati
1) se questi due valori rientrano nel range consentito l'applicazione 
inizializza correttamente l'array e tutto prosegue senza l'intervento di Try
2) se sforo il range Try solleva l'errore e posso intercettarlo
3) se come al punto 1 i valori rientrano nel range ma sono molto alti si 
verifica un out of memory, il problema � che Try non me lo intercetta ed il 
messaggio di errore � quello di delphi con il nome dell'applicazione sulla 
barra del form di errore con il classico messaggio Out of memory
Ho provato anche l'eseguibile al di fuori dell'ide ma stessa cosa...
quello che mi chiedo �, Try � in grado di intercettare Out of memory?
 
 
 
 
 
 

parrebbe di si ma non riesco a chiarire perchè mi salta l'eccezione
da esempi dal web:
 
The except part in this form will catch all possible exception. The example 
of complex except form:
 
 
 
try
 
  DoSomething;
 
  { qui inizializzo l'array con valori *definiti* }
 
except
 
  on E: EArgumentException do
 
    ShowMessage('Invalid argument');
 
  { il seguente non viene chiamato } <---------------------
 
  on E: EOutOfMemory do
 
    ShowMessage('intercetto out of memory');
 
  else
 
    { se l'array è fuori dal range permesso questo *funziona* }
 
    ShowMessage('Other error.');
 
end;
 
 
 
 
 
 

Credo di avere risolto ma qualcuno di anima buona mi da una spiegazione? Per 
capire...
Un rapido riepilogo:
 
Try
  [ inizializzo array ]
Except
  on E: Exception do showmessage('il mio errore');
end;
 
Se l'errore è di tipo Range Check si visualizza il mio messaggio
Se l'errore è Outofmemory si visualizza solo e sempre "Out of memory"
 
Se però nel blocco Except ridefinisco
 
E.Message := 'il mio errore';
Raise;
 
ecco che ottengo in entrambi i casi la mia stringa.
Ho provato anche con un TApplicationEvents ma sempre la stessa cosa.
In sostanza non è vero che Try non intercetta Outofmemory ma come detto devo 
ridefinire Message e forzare il msg con Raise.
 
Vi chiedo se - a prescindere dal funzionamento - questa procedura è 
corretta.
 
Grazie
 
 
 

rettifico, non è la soluzione, ci sto uscendo pazzo, ora non posto più 
altrimenti rischio sane bastonate da spammatore
:-)
ma dopo quanto detto riguardo la ridefinizione di e.message mi accorgo che 
se la stringa che immetto è più lunga di un tot torna l'incubo di Out of 
memory
se e.message := 'il mio errore' è ok ma se invece scrivo 'così intercetto 
errore out of memory bla bla bla' no!!
se invece di voler ottenere il msg a video sempre nel blocco except scrivo
memo1.lines.add('il mio errore') ok, nessuna finestra a video e stringa 
riportata nel memo ma se sta stringa è lunga qualche byte in più l'incubo 
torna (e naturalmente nessuna stringa nel memo)...
ma mi chiedo, sarà mica un problema di mem esaurita che non ha più spazio 
nemmeno per una stringa di qualche byte?
In effetti se metto un free prima di ridefinire e.message e chiamare Raise 
l'applicazione si chiude ma si visualizza anche la stringa lunga a video...
Ho provato ad azzerare l'array con setlength(myarray, 0, 0) ma temo che il 
problema di mem esaurita sia oltre...