title: Delphi thread exception mechanism
body: <p>I have a dilemma on how threads work in delphi, and why at a moment when a thread should raise an exception, the exception is not showed. bellow is the code with comments, maybe somebody cand explain to me how that thread, or delphi, is managing access violations</p>
  
  <p>//thread code </p>
  
  <pre><code>unit Unit2;
  
  interface
  
  uses
    Classes,
    Dialogs,
    SysUtils,
    StdCtrls;
  
  type
    TTest = class(TThread)
    private
    protected
      j: Integer;
      procedure Execute; override;
      procedure setNr;
    public
      aBtn: tbutton;
    end;
  
  implementation
  
  
  { TTest }
  
  procedure TTest.Execute;
  var
    i                 : Integer;
    a                 : TStringList;
  begin
   // make severals operations only for having something to do
    j := 0;
    for i := 0 to 100000000 do
      j := j + 1;
    for i := 0 to 100000000 do
      j := j + 1;
    for i := 0 to 100000000 do
      j := j + 1;
    for i := 0 to 100000000 do
      j := j + 1;
    for i := 0 to 100000000 do
      j := j + 1;
    for i := 0 to 100000000 do
      j := j + 1;
    for i := 0 to 100000000 do
      j := j + 1;
    for i := 0 to 100000000 do
      j := j + 1;
  
    Synchronize(setnr);
    a[2] := 'dbwdbkbckbk'; //this should raise an AV!!!!!!
  
  end;
  
  procedure TTest.setNr;
  begin
    aBtn.Caption := IntToStr(j)
  end;
  
  end.
  </code></pre>
  
  <p>project's code </p>
  
  <pre><code>unit Unit1;
  
  interface
  
  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs,
    Unit2, StdCtrls;
  
  type
    TForm1 = class(TForm)
      Button1: TButton;
      procedure Button1Click(Sender: TObject);
      procedure FormCreate(Sender: TObject);
    private
    public
      nrthd:Integer;
      acrit:TRTLCriticalSection;
      procedure bla();
      procedure bla1();
      function bla2():boolean;
      procedure onterm(Sender:TObject);
    end;
  
  var
    Form1: TForm1;
  
  implementation
  
  {$R *.dfm}
  
  procedure TForm1.bla;
  begin
   try
    bla1;
   except on e:Exception do
     ShowMessage('bla '+e.Message);
   end;
  end;
  
  procedure TForm1.bla1;
  begin
   try
    bla2
   except on e:Exception do
     ShowMessage('bla1 '+e.Message);
   end;
  end;
  
  function TForm1.bla2: boolean;
  var ath:TTest;
  begin
   try
    ath:=TTest.Create(true);
     InterlockedIncrement(nrthd);
    ath.FreeOnTerminate:=True;
    ath.aBtn:=Button1;
    ath.OnTerminate:=onterm; 
     ath.Resume;
   except on e:Exception do
    ShowMessage('bla2 '+e.Message);
   end;
  end;
  
  procedure TForm1.Button1Click(Sender: TObject);
  
  begin
  //
   try
     bla;
     while nrthd&gt;0 do
      Application.ProcessMessages;
   except on e:Exception do
    ShowMessage('Button1Click '+e.Message);
   end;
   ShowMessage('done with this');
  end;
  
  procedure TForm1.FormCreate(Sender: TObject);
  begin
   nrthd:=0;
  end;
  
  procedure TForm1.onterm(Sender: TObject);
  begin
   InterlockedDecrement(nrthd)
  end;
  
  end.
  </code></pre>
  
  <p>the purpose of this application is only to know where the access violation is catched, and how the code should be written.<br>
  I can not understand why in the line "a[2] := 'dbwdbkbckbk';" the AV is not raised. </p>