Per giorni ho difficoltà (ma invano) con le maschere di eccezione.Eccezioni di mascheramento in Delphi
Ho sviluppato un'applicazione che esegue calcoli in virgola mobile su centinaia di migliaia di record. Ovviamente il codice deve essere in grado di gestire le eccezioni, in particolare quelle relative ai calcoli in virgola mobile: Overflow, ZeroDivide, ecc.
L'applicazione viene eseguita correttamente in Windows 7 (32 bit o 64 bit) con molti tipi diversi di processori, se un errore si verifica che la condizione sia gestita correttamente, viene sollevata un'eccezione e il record viene scartato.
Sfortunatamente, i problemi iniziano quando lancio l'applicazione esattamente dove è previsto l'esecuzione: su un server dedicato con CPU Intel Xeon E5-2640 v2 e Windows Server 2003 R2. Qui le eccezioni non vengono sollevate: i record con errori non vengono scartati e quindi i risultati sono inquinati da questi valori numerici con i quali la macchina raffigura +INF
o -INF
.
Il problema è che sul server le impostazioni predefinite del mascheramento dell'errore sono diverse da quelle che troviamo in Windows 7. In particolare, chiamando la procedura GetExceptionMask
sul server di default trovo exZeroDivide
mentre se chiamando GetExceptionMask
su Windows 7 questa eccezione non è mascherata. Il risultato è quello che ho detto: eseguendo l'applicazione sul server queste eccezioni non vengono risolte ma gestite dal processore che restituisce valori estremi e "inquinanti" numerici.
Ok, non fatevi prendere dal panico, dico, basta chiamare (vale a dire in una sezione di inizializzazione) SetExceptionMask
escluso exZeroDivide
, ma non funziona. O meglio, anche se appena dopo aver chiamato SetExceptionMask
l'eccezione exZeroDivide
non è più mascherata, quando viene eseguito il codice con calcoli in virgola mobile l'insieme TArithmeticExceptionMask
restituito da GetExceptionMask
contiene ancora exZeroDivide
e quindi se si verifica un errore l'eccezione non viene sollevata.
Qualcuno può dirmi qual è il modo corretto per chiamare SetExceptionMask
?
Qual è il motivo per cui l'impostazione predefinita di mascheratura può essere diversa da un computer e un'altra? il sistema operativo o il tipo di processore?
Grazie.
Questa è una buona descrizione, ma puoi pubblicare qualche codice di esempio che genera un'eccezione e un esempio per mostrare come stai cercando di gestire il mascheramento? Ciò renderà molto più facile per noi aiutarvi a trovare una soluzione. :) –
Sono d'accordo, difficile da dire senza vedere come stai facendo questo. Suggerisco di avviare una nuovissima applicazione di test che replichi questo comportamento e condivida quel codice con noi. –
Sembra che qualcosa venga iniettato nel tuo processo su Server 2003 - antivirus, global hook, altra utilità di monitoraggio del sistema? - che imposta la parola di flag FP con valori errati. –