我已经查看了与此问题相关的其他问题,但我没有看到答案对我有帮助(或者更多的是我理解的问题)。
此代码:
public static Bitmap GetLibraryObjectImage(Guid guid) {
try {
string tempPath = GetLibraryObjectImagePath(guid);
if (tempPath != string.Empty) {
var bytes = File.ReadAllBytes(tempPath);
var ms = new MemoryStream(bytes);
return (Bitmap)Image.FromStream(ms);
}
}
catch {
return (Bitmap)Image.FromFile(Application.StartupPath + @"\na.bmp");
}
return (Bitmap)Image.FromFile(Application.StartupPath + @"\na.bmp");
}
旨在处理未找到图像文件或以其他方式无效的任何情况。我没有发现任何特定的异常类型,希望它能抓住任何东西。
对于我的一位用户,它抛出了这个异常:
无效参数。
在System.Drawing.Image.FromStream(Stream stream,Boolean useEmbeddedColorManagement,Boolean validateImageData) 在System.Drawing.Image.FromStream(Stream stream)
在ScruffyDuck.AirportDesignEditor.Helpers.U.GetLibraryObjectImage(Guid) GUID)
我之前在处理图像的try-catch块的其他情况下已经看到了这一点。我认为上面的try-catch会获得包括非托管异常在内的一切,但也许我错了。
我不知道导致异常的情况但我真的不希望我的应用程序崩溃和刻录,即使我正在尝试管理问题。它被我的全局异常处理程序捕获,但当然有点晚了。
非常感谢有关避免这种情况的任何见解
答案 0 :(得分:1)
正如评论中提到的@KeithS,堆栈跟踪显示异常源自Image.FromStream
方法。您是否已验证导致该调用的所有代码是否正确返回了预期数据?文件路径必须存在(或者File.ReadAllBytes
会抛出异常)并且MemoryStream
构造函数返回一个有效的流(或者它会抛出异常)但是有可能是内存流实际上不是图像?
此外,您可能希望尝试使用File.OpenRead
方法。这会返回FileStream
,因此您可以直接将其传递给Image.FromStream
方法。这看起来类似于以下代码。 (我将其更改为使用using
语句并且只有一个return语句。)
public static Bitmap GetLibraryObjectImage(Guid guid)
{
Bitmap bitmap = null;
try
{
string tempPath = GetLibraryObjectImagePath(guid);
if (!String.IsNullOrEmpty(tempPath)
{
using (var stream = File.OpenRead(tempPath))
{
bitmap = (Bitmap)Image.FromStream(stream);
}
}
}
catch
{
bitmap = (Bitmap)Image.FromFile(Application.StartupPath + @"\na.bmp");
}
if (bitmap == null)
{
bitmap = (Bitmap)Image.FromFile(Application.StartupPath + @"\na.bmp");
}
return bitmap;
}