Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   try except bei TFileStream im Thread (https://www.delphipraxis.net/158985-try-except-bei-tfilestream-im-thread.html)

Viktorii 10. Mär 2011 10:15

Delphi-Version: XE

try except bei TFileStream im Thread
 
Hallo.


Ich habe folgendes in einem Thread gemacht:
Delphi-Quellcode:
  FileStream := nil;
  FileStream := TFileStream.Create(Path + Filename, fmCreate);
  try
    FileStream.Write(MyString[1], Length(MyString) * 2);
  except
    on E:Exception do
      Application.MessageBox(PWideChar('FileStream Exception: ' + e.Message) , 'Exception', MB_OK + MB_ICONQUESTION);
  end;

  if assigned(FileStream) then
    FreeAndNil(FileStream);
Nun hatte ich den Fall, dass beim create einen Exception aufgetreten ist, weil die Pfadangabe nicht richtig war. Allerdings ist diese Exception immer 'versumpft', wurde also nie gemeldet, da das create ja nicht im try Block war.

Gehört das create in diesem Fall dann doch in den try Block? Sonst liest man, dass da da eigentlich nicht reigehört...

wicht 10. Mär 2011 10:19

AW: try except bei TFileStream im Thread
 
Hi, ich würds so machen:

Delphi-Quellcode:
try
  FileStream := TFileStream.Create(Path + Filename, fmCreate);
  try
    // Aus '2' habe ich SizeOf(Char) gemacht
    FileStream.Write(MyString[1], Length(MyString) * SizeOf(Char));
  finally
    FileStream.Free;
  end;
except
  on E:Exception do
    Application.MessageBox(PWideChar('FileStream Exception: ' + e.Message) , 'Exception', MB_OK + MB_ICONQUESTION);
end;

himitsu 10. Mär 2011 11:04

AW: try except bei TFileStream im Thread
 
Man könnte auch den Exception-Text einfach nur erweitern und dann weiterreichen, anstatt gleich die ganze Exception abzufangen.
Delphi-Quellcode:
try
  FileStream := TFileStream.Create(Path + Filename, fmCreate);
  try
    FileStream.Write(MyString[1], Length(MyString) * SizeOf(Char));
  finally
    FileStream.Free;
  end;
except
  on E: Exception do
    E.Message := 'FileStream Exception: ' + E.Message;
  raise;
end;


Zitat:

Delphi-Quellcode:
MessageBox(PWideChar(...

PWideChar und PChar gemischt?
Schön daß man Unicodefehler auf auf einem Unicode machen kann ... wehe es beschwert sich dann einer, daß es in ANSI nicht läuft :warn:

Application.MessageBox ist auf PChar definiert, also sollte man dan nicht einfach wo PWideChar verwenden.

Sir Rufo 10. Mär 2011 17:07

AW: try except bei TFileStream im Thread
 
Seid ihr euch sicher, dass eine MessageBox in einem Thread sinnvoll ist?
Und eine Exception in einem Thread (auch wenn die nochmals geraised wird) verliert sich im Nirwana.

himitsu 10. Mär 2011 17:23

AW: try except bei TFileStream im Thread
 
nja, diese wäre wenigstens nicht so threadunsicher, wie die VCL,
aber wenn man dann auch noch so "blöd" ist und die MessageBox ebenfalls über die VCL laufen läßt, der braucht sich dann nicht wundern, wenn irgendwann die VCL gleich mit verreckt. :stupid:

- die Windows.MessageBox ist quasi threadsicherer
- Forms.Application.MessageBox nutzt sehr viel von der VCL, bevor es den Aufruf an Windows.MessageBox weiterleitet



Thread-Exceptions verlieren sich nicht im Nirvana ... du darfst nur nicht vergessen diese abzufragen, :roll:
da Delphi sie aus dem Thread rausreicht ... da gab's vor Kurzem einen DP-"Thread" dazu.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz