"JPEG Error #42" 无法通过尝试捕获...除非加载损坏的图像

"JPEG Error #42" not catch by try...except when loading broken Image

我正在尝试使用 TImage.Picture.LoadFromFile() 加载损坏的图像(图像文件大小为 0kb),但 try..except 没有捕捉到 JPEG 错误 #42:

try  
  Image1.Picture.LoadFromFile('myfile.jpg'); // myfile.jpg is broken image
except
  on e: exception do
    ShowMessage('Fail to load');
end;

消息显示 "JPEG error #42",而不是 "Fail to load"。

broken image sample

发生的事情是图像控件绘制自身时异步触发错误。直到那时才处理实际的图像数据,并且图像直到下一个绘制周期才会绘制自己。这发生在你的事件处理程序 returns.

之后

如果您希望能够同步处理错误,那么您需要强制立即处理无效的图像数据。这是实现这一目标的一种相当丑陋的方式:

try  
  Image1.Picture.LoadFromFile('myfile.jpg'); // myfile.jpg is broken image
  (Image1.Picture.Graphic as TJPEGImage).DIBNeeded;
except
  on e:exception do
    ShowMessage('Fail to load');
end;

请注意,Delphi 的现代版本已经解决了这个问题,您问题中的代码将按照您希望和期望的方式运行。