Try - Catch Block的未处理异常

时间:2011-10-11 20:01:20

标签: c# exception-handling try-catch

我已经查看了与此问题相关的其他问题,但我没有看到答案对我有帮助(或者更多的是我理解的问题)。

此代码:

   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会获得包括非托管异常在内的一切,但也许我错了。

我不知道导致异常的情况但我真的不希望我的应用程序崩溃和刻录,即使我正在尝试管理问题。它被我的全局异常处理程序捕获,但当然有点晚了。

非常感谢有关避免这种情况的任何见解

1 个答案:

答案 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;
}