Try..Except 在线程中被忽略

Try..Except ignored inside a thread

我有一个基本的 try..except 可以在尝试将 PNG 文件加载到 TImage 时捕获错误:

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

通常情况下,如果文件不存在,或者在我的情况下 PNG 已损坏,这可以正常工作。我无法控制 PNG 的源创建,因此需要在无法加载 PNG 时捕获,即它给出错误:

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

我的问题是 try..except 在工作线程中。这似乎导致 try..except 被忽略,并且我的程序因 CRC 异常而崩溃。

这个问题有什么简单的修复方法吗?

异常和 try..except 块在工作线程中工作得很好。但是在没有正确同步的情况下访问 UI 控件会导致各种问题。所以不要这样做。

在工作线程的上下文中,使用本地 TPicture 对象或更好的 TPNGImage 对象加载 PNG 文件,然后使用 TThread.Synchronize()TThread.Notify()Assign() 那个对象到 TImage 在主线程的上下文中,例如:

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;