Prekidanje radnje u Delphiju

poruka: 11
|
čitano: 1.515
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
protjeran
offline
Prekidanje radnje u Delphiju 2010

Pozdrav!

Evo nedavno sam počeo učiti programirati u Delphiju pa imam jedan problem.

Napravio sam jedan chat program sa Indy komponentama, ali sad npr kad upišem neki krivi host ono mi izbaci grešku

"Socket error # 1101 - Host not found", i sad sam ja htio da kad korisnik upiše krivi host da ja pošaljem svoju poruku

kao  "Host nije pronađen!".. Napravio sam to ovako

 

  try

    Klijent.Connect();

finally

    if Klijent.Connected = false then ShowMessage('Host nije pronađen!');

end;

 

i sve super, ispiše moju poruku, ali nakon što stisnem OK opet ispiše Host not found...

U čemu je greška?

 
0 0 hvala 0
17 godina
protjeran
offline
RE: Prekidanje radnje u Delphiju 2010

Greška je što si stavio poruku pod finally. Finally će se izvršiti na kraju obrade iznimke. Nemam delphi pa ne mogu probati, no ovako bi nekako trebalo:

 

try

    Klijent.Connect();

except

    ShowMessage('nema hosta');

 

i tek poslije ovoga eventualno pišeš finally tj. ako želiš da se nešto obavi bez obzira da li se dogodila iznimka ili ne. Npr. pod finally bi se moglo staviti

 

Klijent.Disconnect();

 

16 godina
protjeran
offline
"Hvatanje" greške u Delphiju (2010)

Kad napravim sa except

poslije prikazivanja moje poruke izbaci "Access violation at bla bla" Plač

 
0 0 hvala 0
17 godina
protjeran
offline
"Hvatanje" greške u Delphiju (2010)

Daj cijeli code.

Moj PC  
0 0 hvala 0
16 godina
protjeran
offline
Prekidanje radnje u Delphiju

Etot ga na xDDDD

procedure TForm3.Button2Click(Sender: TObject);
begin
  Klijent.Host := Edit1.Text;
  try
    Klijent.Connect();
  except ShowMessage('Host nije pronađen!');
  end;
  Klijent.Socket.Write(Length(Edit3.Text));
  Klijent.Socket.Write(Edit3.Text);
  Klijent.Socket.Write(Length(Edit2.Text));
  Klijent.Socket.Write(Edit2.Text);
  Klijent.Disconnect();
end;

 
0 0 hvala 0
17 godina
protjeran
offline
RE: Prekidanje radnje u Delphiju

Sad pišem napamet, ali probaj ovako:

 

procedure TForm3.Button2Click(Sender: TObject);
begin
  Klijent.Host := Edit1.Text;
  try
    Klijent.Connect();
   Klijent.Socket.Write(Length(Edit3.Text));
    Klijent.Socket.Write(Edit3.Text);
   Klijent.Socket.Write(Length(Edit2.Text));
    Klijent.Socket.Write(Edit2.Text);
   Klijent.Disconnect();
  except ShowMessage('Host nije pronađen!');

  end;
end;

 

Inače, pogledaj i ovdje primjere

 

http://edn.embarcadero.com/article/25665

16 godina
protjeran
offline
RE: Prekidanje radnje u Delphiju
Tracer kaže...

Sad pišem napamet, ali probaj ovako:

 

procedure TForm3.Button2Click(Sender: TObject);
begin
  Klijent.Host := Edit1.Text;
  try
    Klijent.Connect();
   Klijent.Socket.Write(Length(Edit3.Text));
    Klijent.Socket.Write(Edit3.Text);
   Klijent.Socket.Write(Length(Edit2.Text));
    Klijent.Socket.Write(Edit2.Text);
   Klijent.Disconnect();
  except ShowMessage('Host nije pronađen!');

  end;
end;

 

Inače, pogledaj i ovdje primjere

 

http://edn.embarcadero.com/article/25665

Hvala, radi savršeno!

 

17 godina
moderator
online
RE: Prekidanje radnje u Delphiju
ScorpioN60 kaže...

Etot ga na xDDDD

procedure TForm3.Button2Click(Sender: TObject);
begin
  Klijent.Host := Edit1.Text;
  try
    Klijent.Connect();
  except ShowMessage('Host nije pronađen!');
  end;
  Klijent.Socket.Write(Length(Edit3.Text));
  Klijent.Socket.Write(Edit3.Text);
  Klijent.Socket.Write(Length(Edit2.Text));
  Klijent.Socket.Write(Edit2.Text);
  Klijent.Disconnect();
end;

Tracer ti je lijepo napisao ispravan kod - samo ti zelim objasniti zasto ti ovo nije valjalo. Ti se s Connect probas spojiti - u slucaju da sve prodje, super, Button2Click metoda ce se izvrsiti do kraja.

 

U slucaju da se ne uspije spojiti, ispisat ce se poruka "Host nije pronadjen!", no nece se prekinuti izvrsavanje metode Button2Click, nego ce se i u tom slucaju ona izvrsiti do kraja! Znaci, radis sa Socketima, a nisi spojen! Naime, zatvaranjem u try..except blok ti si se osigurao da ne dodje do prekida u izvrsavanju metode Button2Click.

 

Problem si mogao rijesiti i tako da si iza ShowMessage('Host nije pronađen!'); dodao Abort; - znaci, da si sam, kad dodje do greske, prekinuo izvrsavanje metode Button2Click. Problem si vjerojatno mogao rijesiti i tako da si sve ovo iza try...except bloka zatvorio u if..then uvjet u kojem bi provjeravao je li Klijent.Connected. To su mogucnosti, no to se inace tako ne radi - radi se onako kako je Tracer napisao.

 

Eventualno, ako se hoces dodatno osigurati da zatvoris konekciju, morao bi odspajanje izvaditi iz try..except bloka, posto je odspajanju mjesto u finally (ako dodje do jos koje iznimke unutar try bloka, nece se obaviti Disconnect), ili se pak moze rijesiti na ovaj nacin:

procedure TForm3.Button2Click(Sender: TObject);
begin
  Klijent.Host := Edit1.Text;
  try
    Klijent.Connect();
    Klijent.Socket.Write(Length(Edit3.Text));
    Klijent.Socket.Write(Edit3.Text);
    Klijent.Socket.Write(Length(Edit2.Text));
    Klijent.Socket.Write(Edit2.Text);
  except
    ShowMessage('Host nije pronađen!');
  end;

 if Klijent.Connected then Klijent.Disconnect();
end;

 

Alternativna verzija bi bila koristenjem dva try.. bloka, vanjski try..finally, a unutrasnji try..except.

procedure TForm3.Button2Click(Sender: TObject);
begin
  Klijent.Host := Edit1.Text;
  try
    try
      Klijent.Connect();
      Klijent.Socket.Write(Length(Edit3.Text));
      Klijent.Socket.Write(Edit3.Text);
      Klijent.Socket.Write(Length(Edit2.Text));
      Klijent.Socket.Write(Edit2.Text);
    except
      ShowMessage('Host nije pronađen!');
    end;
  finally
    if Klijent.Connected then Klijent.Disconnect();
  end;
end;

 

 

Usput receno, liniju koju si napisao u onom svom prvom kodu, a koja ti je doduse sad nepotrebna:

if Klijent.Connected = false then ShowMessage('Host nije pronađen!');

mogao si ljepse napisati kao

if not Klijent.Connected then ShowMessage('Host nije pronađen!');

 

Naime, isto kao sto neces provjeravati je li uvjet istinit na nacin if Klijent.Connected = truethen..., isto tako neces provjeravati je li = false.Namigiva Nego ces raditi if Klijent.Connected then, odnosno if not Klijent.Connected then.

 

Poruka je uređivana zadnji put sub 13.3.2010 17:42 (mbaksa).
17 godina
protjeran
offline
RE: Prekidanje radnje u Delphiju
mbaksa kaže...

...

  finally
   if Klijent.Connected then Klijent.Disconnect();
  end;

 

..ili još jednostavnije

 

  finally
    Klijent.Disconnect();
  end;

17 godina
moderator
online
RE: Prekidanje radnje u Delphiju
Tracer kaže...
mbaksa kaže...

...

  finally
   if Klijent.Connected then Klijent.Disconnect();
  end;

 

..ili još jednostavnije

 

  finally
    Klijent.Disconnect();
  end;

Da, moze. Napisao sam onako za svaki slucaj, jer nisam radio s tom komponentom pa nisam bio 100% siguran da ne baca iznimku ako pokusas zatvoriti zatvoreni socket.

16 godina
protjeran
offline
Prekidanje radnje u Delphiju

Hvala na pomoći

 
0 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice