来自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会得到包括非托管异常在内的所有内容,但也许我错了。

我不知道导致异常的情况,但我真的不希望我的应用程序崩溃和燃烧,即使我试图管理的问题。它被我的全局异常处理程序捕获,但当然到那时已经有点晚了。

非常感谢您的建议

来自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;
}