obsługa wyjątków

0

mamy takie coś
Wyjątki

posługuję się składnią
try .. except .. end;

kompiluję program ctrl+F9
odpalam exe'ka

a mimo to wciąż wywala mi błąd i przerywa działanie pętli
dlaczego?!
błąd jest pomiędzy try a except

procedura wygląda następująco:
ListBox1. - list box - lista katalogów
ListBox2 - wynikowa lista plików

begin
        jpg:=TJPEGImage.Create;
        if FindFirst(ListBox1.Items.Strings[n]+'\*.jpg',faAnyFile,sr)=0 then   //wyszukiwanie wszystkich plików jpg w katalogu
          begin
          repeat
          if oo1.Checked=true then   // jeśli jest włączone sprawdzanie rozdzielczości
            begin
            try
            jpg.LoadFromFile(ListBox1.Items.Strings[n]+'\'+sr.Name);   //wczytanie pliku, TO TU CZASAMI WYSTĘPUJĄ BŁĘDY
            r:=inttostr(jpg.Width)+'x'+inttostr(jpg.Height);   // wczytanie rozdzielczości
            if ini.SectionExists(r) then ListBox2.Items.Add(ListBox1.Items.Strings[n]+'\'+sr.Name);   // sprawdzenie czy rozdzielczość jest znana i ewentualnie dodaje plik do listy
            except
            Inc(nerr);   //   wrazie wystąpienia błędu zliczaj ich ilość
            arrerr[nerr]:=ListBox1.Items.Strings[n]+'\'+sr.Name;   // jeśli wystąpi błąd zarejestruj informację o nim, czyli zapisz ścieżkę do pliku
            end;
            end else ListBox2.Items.Add(ListBox1.Items.Strings[n]+'\'+sr.Name);  // jeśli nie ma sprawdzania rozdzielczości, dodawaj wszystkie pliki - działa bez zarzutu
          until FindNext(sr) <> 0;
          end;
        jpg.Free;
        end;

błąd: Acces Voilation
przerwanie pętli, dalsze pliki nie są już wyszukiwane

a ma nie być komunikatu o błędzie, a pliki mają się wyszukiwać dalej.
co jest w tym źle?

pozdrawiam.

0

ListBox1.Items.Strings[n] gdzie n 0..ListBox.Items.Strings.Count()-1 ? To pierwsze nasuwa mi sie na mysl.
Mozna przytoczyc komunikat bledu? - bo przy strings[] byloby Index List out of bounds (jakos tak)

W ktorym miejscu pojawia sie ten wyjatek? Juz przy if FindFirst() czy dalej ?

0

zaznaczyłem w komentarzu w kodzie. błąd jest przy wczytywaniu pliku JPG.
jpg.LoadFromFile

zauważyłem, że program nie jest wstanie wczytać każdego pliku, dlatego zrobiłem obsługę błędu.
ale okazało się, że obsługa błędu nie działa
tzn wciąż następuje przerwanie procedury

ilość itemów na liście jest z całą pewnością OK.
błąd nie występuje w czasie kompilacji, dopiero w trakcie działania programu, dlatego jedyne co jestem w stanie powiedzieć a propos błędu to że brzmi on "Acces Voilation"

Z kolei jeśli uruchomię program przez F dostanę takie 3 błędy:

  1. Error
    Project project.exe raised exception class 'RunError(103)'
  2. Debugger Exeption Notification
    Project project1.exe raised exception class 'EInOutError' with message: File not open
  3. Error
    Project project1.exe raised exception class 'External: SIGSEGV'
0

A gdzie tworzysz INI?

EDIT//
Ale komunikat błędu nie występuje przypadkiem tylko wtedy gdy wykonujesz program z poziomu Delphi?

0
except napisał(a)

jpg.LoadFromFile(ListBox1.Items.Strings[n]+''+sr.Name); //wczytanie pliku, TO TU CZASAMI WYSTĘPUJĄ BŁĘDY

Najprawdopodobniej przy wejściu do nowego katalogu sr.Name zwraca najpierw

"."
".."

a potem dopiero dostajesz pliki *.jpg

spróbuj przed tą linijką wstawić coś takiego:

if (sr.Name = '.') or (sr.Name = '..') then ShowMessage('blbla');

i zobacz wtedy

0

Idac tym tropem co Młody

if pos('.',sr.Name)=1 then 

Swoja droga, moze faktycznie dobrze zainwestowac w dodatkowa liste stringow (np TMemo) i sprawdzic co on znajduje za pomoca FindFirst()

0
kAzek napisał(a)

A gdzie tworzysz INI?

EDIT//
Ale komunikat błędu nie występuje przypadkiem tylko wtedy gdy wykonujesz program z poziomu Delphi?

INI wczytuje bez problemu. testowałem usuwając poszczególne linijki, żeby wyłapać gdzie jest błąd. zawsze na LoadFromFile i zawsze na tych samych plikach.
błąd występuje też przy odpalaniu aplikacji samodzielnie, bez Delphi (Lazarusa)

Młody napisał(a)

Najprawdopodobniej przy wejściu do nowego katalogu sr.Name zwraca najpierw

"."
".."

a potem dopiero dostajesz pliki *.jpg

błąd jest nawet przy jednym katalogu. zresztą wstawiłem ShowMessage z linkiem i jest poprawny.

raczej zastanawia mnie dlaczego mimo zastosowania bloku try except jest błąd i wstrzymanie procedury. przecież

"Jeżeli kod znajdujący się po słowie try spowoduje wystąpienie błędu, program automatycznie wykona instrukcje umieszczone po słowie except. Po zakończeniu bloku wystąpienie wyjątku nie jest przekazywane dalej. Instrukcje znajdujące się po słowie end będą wykonane, bez względu na pojawienie się wyjątku w danym bloku."

co zauważyłem: błąd występuje na plikach 1,2MB i 34kB więc to również nie kwestia rozmiaru. po prostu jakiś problem być może źle zapisany format pliku i w rzeczywistości to nie jest jpg, niemniej po to właśnie jest try except, żeby takie problemy wyeliminować...

1 użytkowników online, w tym zalogowanych: 0, gości: 1