AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TPath.Combine, TPath.GetTempPath threadsicher?
Thema durchsuchen
Ansicht
Themen-Optionen

TPath.Combine, TPath.GetTempPath threadsicher?

Ein Thema von zeras · begonnen am 28. Dez 2014 · letzter Beitrag vom 29. Dez 2014
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: TPath.Combine, TPath.GetTempPath threadsicher?

  Alt 29. Dez 2014, 13:22
Sehr grausam, wie hier manche mit den Exceptions umgehen ... indem man versucht diese mit aller Gewalt zu umgehen

Das ist doch absoluter Schwachfug und führt einzig und alleine dazu, dass irgendwas nicht funktioniert, aber keiner merkt es.
Delphi-Quellcode:
Function CopyStream2File(ResourceID: string): String;
var
    ResStream: TResourceStream;
begin
    ResStream := TResourceStream.Create(HInstance, ResourceID, RT_RCDATA);
    try
      //MP3 File aus Resource laden und in Filesystem ablegen
      Result := TPath.Combine(TPath.GetTempPath, 'tmp.mp3');

      ResStream.Position := 0;
      ResStream.SaveToFile(fName);
    finally
      ResStream.Free;
    end;
end;

begin
  Play( CopyStream2File('42') );
end;
Wann passiert es denn, dass ich hier eine Exception bekomme?
  • Die ResourceID ist falsch, weil nicht vorhanden -> Fehler beim Programmierer
  • Das Temp-Verzeichnis ist nicht beschreibbar -> Fehler beim Anwender
Aber anstatt sich den Hinweis hier um die Ohren zu hauen, wird der einfach hübsch versteckt, weil das sieht ja dann "besser" aus. Voll profimässig

Exceptions sind nicht böse, sondern sehr hilfreich.

Und wenn man die Exceptions wirklich nicht anzeigen möchte, dann geht das ganz simpel, indem man Delphi-Referenz durchsuchenTApplication.OnException mit einem Event belegt und dort wenigstens diese Meldungen protokolliert.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: TPath.Combine, TPath.GetTempPath threadsicher?

  Alt 29. Dez 2014, 14:45
Sehr grausam, wie hier manche mit den Exceptions umgehen ...
Ach ja was gibt es denn hieran

Delphi-Quellcode:
var
   FName : String;
   error : boolean;
begin
   ...
   try
     error := CopyStream2File('42',FName);
   except
     MyError('Fehler...');
   end;

   if not Error then
     Play(FName)
   
end;
aus zu setzen?

Von mir aus auch

Delphi-Quellcode:
var
   FName : String;
   error : integer;
begin
   ...
   try
     error := CopyStream2File('42',FName);
   except
     MyError('Fehler...',error);
   end;

   if Error=0 then
     Play(FName)
   
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: TPath.Combine, TPath.GetTempPath threadsicher?

  Alt 29. Dez 2014, 15:00
Ganz einfach das hier:
Delphi-Quellcode:
var
   FName : String;
   error : boolean;
begin
   ...
  error := False; // damit das auf jeden Fall initialisiert ist
   try
     error := CopyStream2File('42',FName); // <- das erzeugt eine Exception
   except
     MyError('Fehler...'); // <- Ja wird ausgeführt
   end;

   if not Error then // <- Was für einen Wert hat jetzt Error? Richtig: False - äh, aber das ist doch Falsch! Eben darum
     Play(FName)
   
end;
Und wenn wir diese initiale Zuweisung von error := False; weglassen, dann haben wir einen Zufallsgenerator. Mal wird Play(FName) ausgeführt und mal nicht, obwohl es immer einen Fehler gibt. Dadurch kommen dann solche Gerüchte über Auswirkungen von Erdstrahlen oder Sonnenflecken auf die Programme auf.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: TPath.Combine, TPath.GetTempPath threadsicher?

  Alt 29. Dez 2014, 15:01
Ohne es nachgeprüft zu haben, aber könnte es sein das TPath.GetTempPath den Pfad ohne abschliessenden Slash bzw. Backslash zurückgibt?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: TPath.Combine, TPath.GetTempPath threadsicher?

  Alt 29. Dez 2014, 15:09
Ohne es nachgeprüft zu haben, aber könnte es sein das TPath.GetTempPath den Pfad ohne abschliessenden Slash bzw. Backslash zurückgibt?
Dem ist zwar so (ja, nur nicht von dem Namen Get...Path verwirren lassen, es wird trotzdem ein Directory zurückgeliefert und eben kein Path), spielt aber keine Geige, denn es wird ja TPath.Combine benutzt, und das sorgt dafür, dass der richtige Trenner dazwischen kommt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#16

AW: TPath.Combine, TPath.GetTempPath threadsicher?

  Alt 29. Dez 2014, 15:25
Und wenn wir diese initiale Zuweisung... weglassen, dann haben wir einen Zufallsgenerator.
Logisch... hatte ich übersehen...

Deswegen so

Delphi-Quellcode:
Function CopyStream2File(ResourceID: string; var fName: String): boolean;
var
    ResStream: TResourceStream;

begin
   Result := False;
    
   try
    ResStream := TResourceStream.Create(HInstance, ResourceID, RT_RCDATA);
    try
      //MP3 File aus Resource laden und in Filesystem ablegen
      fName := TPath.Combine(TPath.GetTempPath, 'tmp.mp3');
// fName := TPath.Combine('/data/data/com.embarcadero.Meinprogram/files/', 'tmp.mp3');

      ResStream.Position := 0;
      ResStream.SaveToFile(fName);
      Result := True;
    finally
      ResStream.Free;
    end;
   except
   end
end;
Schon habe ich ein Error-Free Programm/Procedure und ob und wie ich den Fehler ausgeben will kann ich außerhalb anhand meines Boolean entscheiden...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.544 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: TPath.Combine, TPath.GetTempPath threadsicher?

  Alt 29. Dez 2014, 15:34
Und da steht dann "Es ist ein Fehler aufgetreten", da man die Exception einfach geschluckt hat und somit nicht weiß, welche überhaupt geworfen wurde, geschweige denn ihren ggf. vorhandenen Fehlertext gespeichert hat.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: TPath.Combine, TPath.GetTempPath threadsicher?

  Alt 29. Dez 2014, 15:51
Und wenn man so etwas mit aller Gewalt haben will, dann sollte man das auch sprachlich entsprechend hervorheben, damit man auch später noch weiß, dass da etwas in die Hose gehen kann, ohne dass man eine Exception bekommt:
Delphi-Quellcode:
Function CopyResourceToFile( const ResourceID: string ) :String);
var
    ResStream: TResourceStream;
begin
    ResStream := TResourceStream.Create(HInstance, ResourceID, RT_RCDATA);
    try
      //MP3 File aus Resource laden und in Filesystem ablegen
      fName := TPath.Combine(TPath.GetTempPath, 'tmp.mp3');

      ResStream.Position := 0;
      ResStream.SaveToFile(fName);
    finally
      ResStream.Free;
    end;
end;

function TryCopyResourceToFile( const ResourceID: string; out AFileName : string ) : Boolean;
begin
  try
    AFileName := CopyResourceToFile( ResourceId );
    Result := True;
  except
    Result := False;
  end;
end;
Jetzt kann man das wahlweise mit oder ohne Exception-Behandlung benutzen:
Delphi-Quellcode:
// mit Exception
Play( CopyResourceToFile( '42' ) );
// oder ganz bewusst im Code auf die Exception verzichten
if TryCopyResourceToFile( '42', FName ) then
  Play( FName );
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (29. Dez 2014 um 16:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.012 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#19

AW: TPath.Combine, TPath.GetTempPath threadsicher?

  Alt 29. Dez 2014, 16:01
Schon habe ich ein Error-Free Programm/Procedure und ob und wie ich den Fehler ausgeben will kann ich außerhalb anhand meines Boolean entscheiden...
Und mit welcher magischen Funktion wandel ich den Zustand False wieder in eine aussagekräftige Fehlerinformation um?
Indem ich mir genau wie die WinAPI nen GetMyLastError baue oder was?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.544 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: TPath.Combine, TPath.GetTempPath threadsicher?

  Alt 29. Dez 2014, 16:05
Meine Rede. Ich freu mich auch immer in der Hotline, wenn solche ominösen Fehlermeldungen auftauchen, weil man ja ganz schlau mit Exceptions umgegangen ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 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