来自Try - Catch块的未处理异常
本文关键字:未处理 异常 Catch Try 来自 | 更新日期: 2023-09-27 18:11:12
我看过与这个问题相关的其他问题,但我没有看到帮助我的答案(或者可能更多的是我理解的点)。
这个代码: 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, Boolean useEmbeddedColorManagement, Boolean validateImageData在System.Drawing.Image。FromStream(流流)
ScruffyDuck.AirportDesignEditor.Helpers.U.GetLibraryObjectImage (Guidguid)
我以前在处理图像的try-catch块中看到过这种情况。我认为上面的try-catch会得到包括非托管异常在内的所有内容,但也许我错了。
我不知道导致异常的情况,但我真的不希望我的应用程序崩溃和燃烧,即使我试图管理的问题。它被我的全局异常处理程序捕获,但当然到那时已经有点晚了。
非常感谢您的建议
正如@ keith在注释中提到的,堆栈跟踪显示异常起源于Image.FromStream
方法。您是否验证了导致该调用的所有代码都正确返回了预期的数据?文件路径必须存在(或File.ReadAllBytes
会抛出一个异常)和MemoryStream
构造函数返回一个有效的流(或它会抛出一个异常),但是否有可能,在内存流中的数据实际上不是一个图像?
另外,您可能想尝试使用File.OpenRead
方法。这将返回一个FileStream
,因此您可以将其直接传递给Image.FromStream
方法。这看起来类似于下面的代码。(我改变了一些,使用using
语句,只有一个返回语句)
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;
}