"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"。
发生的事情是图像控件绘制自身时异步触发错误。直到那时才处理实际的图像数据,并且图像直到下一个绘制周期才会绘制自己。这发生在你的事件处理程序 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 的现代版本已经解决了这个问题,您问题中的代码将按照您希望和期望的方式运行。
我正在尝试使用 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"。
发生的事情是图像控件绘制自身时异步触发错误。直到那时才处理实际的图像数据,并且图像直到下一个绘制周期才会绘制自己。这发生在你的事件处理程序 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 的现代版本已经解决了这个问题,您问题中的代码将按照您希望和期望的方式运行。