unit UFExceptFichier;
//exécuter l'exemple en pas à pas dès le déclenchement d'un exception
interface

uses
 SysUtils, Classes, QGraphics, QControls, QForms, QDialogs,
  QStdCtrls, QButtons;

type
  TForm1 = class(TForm)
   BitBtnExcept: TBitBtn;
   BitBtnFinally: TBitBtn;
   Edit1: TEdit;
   procedure BitBtnExceptClick(Sender: TObject);
   procedure BitBtnFinallyClick(Sender: TObject);
  private
   { Déclarations privées }
  public
   { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation
{  dans unit SysUtils (source\rtl\sys):
  - EConvertError = class(Exception);
  -EInOutError = class(Exception)
  public
   ErrorCode: Integer;
  end;

}
{$R *.dfm}

procedure TForm1.BitBtnExceptClick(Sender: TObject);
const NomFichier='Fichier.txt';
var
  F: TextFile;
  S: string;
begin
  AssignFile(F,NomFichier );{ Fichier attaché }
  try
   Reset(F);        { s'il y a un incident ici, le fichier n'est pas ouvert}
   Readln(F, S);    { Lecture de la première ligne du fichier }
   Edit1.Text := S; { copie de la chaîne dans Edit1 }
   Erase(F);        { on ne peut effacer que si CloseFile a été lancé !}
   CloseFile(F);    { Fermeture du fichier }
  except
 
   on EInOutError do begin
    MessageDlg('Fichier : '+ NomFichier+#13#10+'Arrêt du chargement',
              mtError, [mbOk], 0);
    Form1.caption:='Incident au chargement';
    Edit1.text:='';
   end;
  end;
  try   //Etat du fichier après gestion de l'incident (le fichier n'est pas fermé)
   CloseFile(F);    { on tente un fermeture du fichier }
  except
   on Elocale:EInOutError do begin //accès au message de l'exception locale
    MessageDlg('Fichier : '+ NomFichier+#13#10+'incident de fermeture',
                mtError, [mbOk], 0);
    Form1.caption:=Elocale.message;
    Edit1.text:='Code Erreur = '+inttostr(Elocale.ErrorCode); //accès au code erreur de cette exception
   end;
  end
end;

procedure TForm1.BitBtnFinallyClick(Sender: TObject);
//traitement d'une exception redéclenchée
const NomFichier='Fichier.txt';

var
  F: TextFile;
  S: string;
  i:integer;
begin
AssignFile(F,NomFichier );{ Fichier attaché }
try
  Reset(F);
  try
    Readln(F, S);    { Lecture de la première ligne du fichier }
    Edit1.Text := S; { copie de la chaîne dans Edit1 }
    Erase(F);        { Exception accès refusé !}
  finally  //si incident on redéclenche la même exception pour la gérer
   CloseFile(F);    { Fermeture du fichier }
  end
except
  on Elocale:EInOutError do begin //accès au message de l'exception locale
    MessageDlg('Fichier : '+ NomFichier+#13#10+'Arrêt du chargement E/S',
                mtError, [mbOk], 0);
    Form1.caption:=Elocale.message;
    Edit1.text:='Code Erreur = '+inttostr(Elocale.ErrorCode); //accès au code erreur de cette exception
   end;
  on Elocale:EConvertError do begin //accès au message de l'exception locale
    MessageDlg('Fichier : '+ NomFichier+#13#10+'Arrêt du chargement conv',
                mtError, [mbOk], 0);
    Form1.caption:=Elocale.message;
   end;
end ;
try  //Etat du fichier après gestion de l'incident (le fichier est fermé)
   CloseFile(F);    { on tente un fermeture du fichier }
  except
   on Elocale:EInOutError do begin //accès au message de l'exception locale
    MessageDlg('Fichier : '+ NomFichier+#13#10+'incident de fermeture',
                mtError, [mbOk], 0);
    Form1.caption:=Elocale.message;
    Edit1.text:='Code Erreur = '+inttostr(Elocale.ErrorCode); //accès au code erreur de cette exception
   end;
  end
end;

end.