Search code examples
delphipngvcltimage

Try..Except ignored inside a thread


I have a basic try..except to catch errors when trying to load a PNG file into a TImage:

try
  Previewimage.Picture.LoadFromFile(filename);
except
  //code to handle exception
end;

Normally this works fine if the file does not exist, or in my case the PNG is corrupted. I have no control over the source creation of the PNG, so need to catch when the PNG cannot be loaded, ie it gives the error:

This "Portable Network Graphics" image is not valid because it contains invalid pieces of data (crc error).

My issue is that the try..except is within a worker thread. This seems to cause the try..except to be ignored, and my program crashes with the CRC exception.

Are there any easy fixes for this issue?


Solution

  • Exceptions and try..except blocks work just fine in worker threads. But accessing UI controls without proper synchronization can lead to all kinds of problems. So just don't do it.

    In the context of the worker thread, load the PNG file using a local TPicture object, or better a TPNGImage object, then use TThread.Synchronize() or TThread.Notify() to Assign() that object to the TImage in the context of the main thread, eg:

    try
      PNG := TPNGImage.Create;
      try
        PNG.LoadFromFile(filename);
        TThread.Synchronize(nil,
          procedure
          begin
            Previewimage.Picture.Assign(PNG);
          end
        );
      finally
        PNG.Free;
      end;
    except
      //code to handle exception
    end;