Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   {$i-} - {$iochecks off} (https://www.delphipraxis.net/216964-%7B%24i-%7D-%7B%24iochecks-off%7D.html)

TM6 31. Mär 2025 07:57

Delphi-Version: 5

{$i-} - {$iochecks off}
 
Ich habe eine Verständnisfrage.
Ich bin immer davon ausgegangen, dass es bei der Verwendung von {$I-} keine Exception geben würde, da diese von Delphi abgefangen wird und ich den Fehlercode über IOResult erhalte.
Ich sichere MeinString <> '' vorher ab (Delphi-Hilfe von ForceDirectories) und es gibt in bestimmten Fällen trotzdem eine IO-Exception.

Code:
exception class           : EInOutError
exception message         : Verzeichnis kann nicht erstellt werden.
Delphi-Quellcode:
if MeinString = '' then exit;

{$I-}SysUtils.ForceDirectories( MeinString );{$I+}
error := IOResult;
if ( error = 0 )
then ...
else ...
Ist trotz {$I-} immer ein try .. except notwendig, und {$I-} ist nur eine Erleichterung, den Fehlercode auszuwerten?

Das ist aber in der Hilfe anders formuliert bzw. interpretiere ich das anders:

Zitat:

Anmerkungen

Mit der Direktive $I wird die automatische Code-Generierung aktiviert bzw. deaktiviert, die nach jedem Aufruf einer E/A-Prozedur das Ergebnis überprüft. Eine ausführliche Beschreibung der E/A-Prozeduren finden Sie in der Delphi-Sprachreferenz. Wenn eine E/A-Prozedur bei aktivierter Option ein Ergebnis ungleich 0 zurückgibt, führt dies zu einer EInOutError-Exception (bzw. zum Programmabbruch, wenn die Exception-Behandlung nicht aktiviert ist). Ist die Option deaktiviert, muss die E/A-Operation durch einen Aufruf von IOResult auf Fehler geprüft werden.
Das Problem tauchte bei mir auf, als ich auf einen Ordner in den eigenen Dateien zugreifen wollte
Code:
SysUtils.ForceDirectories( TPath.GetDocumentsPath + '\MeinUnterordner' )
und die Windows-API einen leeren String zurücklieferte.
Siehe dazu meine Frage in
https://www.delphipraxis.net/216958-...e-dateien.html

himitsu 31. Mär 2025 10:17

AW: {$i-} - {$iochecks off}
 
{$IOChecks} schaltet optionalen Prüfcode für die uralten Pascal-Dateifunktionen aus, also jene um AssignFile.

AssignFile/Append/Reset/Rewrite/Read/ReadLn/Write/WriteLn/Close/...


Delphi-Quellcode:
{$I+}
...
Write('blubb');
wird quasi zu
Delphi-Quellcode:
Write0UString(Output, 'blubb');
{$IFOPT I+}
if not IOTest then
  Error;
{$ENDIF}
Ich wäre fast 100% der Mienung, dass IOResult in diesem Fall nicht das Ergebnis des intern verwendeten Delphi-Referenz durchsuchenCreateDir und vor allem nicht vom MSDN-Library durchsuchenCreateDirectory wiederspiegelt.


Wer sich den Quellcode von ForceDirectories ansieht, wird feststellen, dass dort keine dieser alten API verwendet wird,
bei Eingabe-Fehlern explizit eine Exception ausgelößt wird (ja, genau dieses
Delphi-Quellcode:
''
)
und sonst jemand dringend den Rückgabewert dieser Funktion prüfen sollte.

Delphi-Quellcode:
if not SysUtils.ForceDirectories( MeinString) then
  RaiseLastOSError;
Delphi-Quellcode:
if not SysUtils.ForceDirectories( MeinString) then begin
  TheError := GetLastError;
  ...
end;

Mavarik 31. Mär 2025 12:12

AW: {$i-} - {$iochecks off}
 
Zitat:

Zitat von himitsu (Beitrag 1547645)
die uralten Pascal-Dateifunktionen aus, also jene um AssignFile.

LOL... Nicht jeder nimmt einen Stream...

Mavarik :coder:

himitsu 31. Mär 2025 12:45

AW: {$i-} - {$iochecks off}
 
TFile.WriteAll... und TFile.ReadAll... (Bytes, String-Array oder ein String)
TDirectory.Create
...

TM6 1. Apr 2025 07:20

AW: {$i-} - {$iochecks off}
 
Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 Uhr.

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