Mesajul ala nu ar trebui sa apara. Nu e eroare de logica, ci e eroarea e data la citirea din campurile tabelei modifcm (Date personal).
Practic pot fi doua cauze. Fie Pointer neinitializat, ceea ce ar da dovada de eroare de programare, nu e cazul pentru ca merge le restul clientilor, nu exista ramificatii ascunse, nu e nici un if pe acolo,
fie nu ii place ce sau unde citeste. Adica structura incorecta relativ cu versiunea executabilului, ajungand fie sa vrea sa citesca coloana 59 cand sunt numai 58 coloane, fie tocmai din intercalarea
unei noi coloane aduse pe noua versiune, astfel unde te asteptai sa fie un numar, acum se afla un sir de caractere, si va da eroare de conversie.

Ideea e ca in unele locuri se ofera mesaje mai complexe, si oricum majoritatea nu le intelege si nu le citeste, in alte locuri se ofera prea putina informatie.
Am inteles ca aveti oaresce cunostinte de programare. Asta insemna pe de o parte ca intelegeti ca un mesaj complet de cele mai multe ori tot nu ajuta, pentru ca trebuie sa fii in domeniu,
iar pe de alta parte ca pentru a oferi un mesaj clar de eroare, el trebuie prins la timp.

Asta inseamna ca aplicatia ar trebui impanzita de zone de prindere a exceptiei.
De exemplu daca ai un cod care citeste din tabla A, ai mai apoi cod ce citeste din B, si la pe undeva cod ce imparte valoarea din A la B, se pot genera cel putin 3 erori.
2 din ele pot suna la fel de bine Field "X" not Found. Alta poate suna EConvertError.
Pe undeva prin cod, daca am si alte variabile, ma pot trezi si cu genericul EAccessViolation.
Acestea sunt toate exceptii aruncate de Windows sau BDE. Ca sa le customizes si sa fie friendly trebuie prinse si analizate.

Ca sa le prind se foloseste blocul try except sau try catch daca esti mai acomodat cu limbajul java.
Daca folosesc unul singur, voi primi unul din mesajele de mai sus, dar BDE-ul nu transmite ce tabla a aruncat exceptia. Doar campul.
Daca e acces violation sau divide By 0, Windowsul nu imi va spune denumirea variabilei ce a aruncat eroarea, pentru ca odata transformat in cod masina, assembler, nu e decat o adresa pe memorie.
Este ca obsufocate-ul la java.
Asa ca trebuie sa pun mai multe blocuri try catch.
Unul ce sa prinda prima tabla, altul pe a doua tabla, altul pe codul cu impartire la 0.
Ce ne facem daca apelul pe table se face intercalat? Daca am direct A.Field1 + B.Field2? E o singura linie, nu poti sa le bagi in blocuri separate, deci nu vei sti cine din A si B e gresit.
Singura solutie e sa preevaluezi intr-un bloc pe A.Field1 si apoi pe B.Field2 pentru ca, in caz de eroare sa dai mesajul cel frumos, si dupa aia executi operatia.

Astfel pentru 10 randuri ajungi sa ai nevoie de 5-6 blocuri de try catch, poate chiar mai multe, pentru ca mentorul nu se rezuma la adunat pe o linie 2 valori din 2 table, operatiile pot fi mult mai complexe.

Si acum, sa zicem ca te apuci sa dublezi codul aplicvatiei cu aceste mesaje explicite, ajungi sa iti pui intrebarea: Daca la fiecare bloc try catch pierzi la executie cate 0.4 milisecunde fata de codul fara el,
nici a 3-a parte dintr-o milisecunda, o masura de timp ignorata total, pentru ca nu o observam intr-o executie individuala,
cat timp se pierde cand ajungi sa ai vreo 50 de blocuri intr-un loop de 50.000 de inregistrari? 16 minute. Iar o lista de 50000 de inregistrari nu dureaza mai mult de un minut.

Cu alte cuvinte, daca aici a fost vorba doar de a nu incarca programul cu cod care nu ar trebui sa se execute, pentru ca diferenta de executie este redusa, la fel de bine puteati pune intrebarea asta la executia unei
liste, caz in care sa sacrifici majoritatea pentru exceptie, pt ca pe delphi au fost mai inspirati sa numeasca blocul try except, nu catch, este inadmisibil.

https://stackoverflow.com/questions/...are-not-thrown

Concluzionand,
Din experienta mea, cand am de facut o aplicatie cu 500 de linii de cod, ce nu face mare lucru, pot sa bag cate mesaje vreau pe ea, pentru ca nu va afecta timpul de executie a ceea ce fac daca nu e complex,
oricum, variabilele sunt limitate, deci poti pana la urma sa o faci perfecta, si nici nu te gandesti la timpul suplimentar alocat pentru a construi toate aceste mesaje. Pentru ca, dupa cum am explicat, nu e doar textul,
e si amplasarea codului, ce necesita planificare suplimentara, daca vrei in continuare sa optimizezi codul. Dar atunci cand complexitatea e mare, aplicatia este deja mare si pe desupra se lucreaza contra timp,
esti nevoit sa minimizezi codul de tratare a exceptiilor. Ca fapt divers, cand a aparut aplicatia Salarii in afara aplicatiei Mentor, nu a aparut din dorinta de a o izola, de a fi ceva aparte, ci din cauza ca executabilul
de mentor devenise prea mare ca sa mai ruleze pe Windows 98.