【问题标题】:Unhandled Exception from Try - Catch BlockTry 中未处理的异常 - Catch 块
【发布时间】:2011-10-11 20:01:20
【问题描述】:

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

这段代码:

   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(流 流,布尔值 useEmbeddedColorManagement,布尔值 validateImageData) 在 System.Drawing.Image.FromStream(Stream 流)
在 ScruffyDuck.AirportDesignEditor.Helpers.U.GetLibraryObjectImage(Guid 指导)

我以前在处理图像的 try-catch 块中的其他情况下看到过这种情况。我认为上面的 try-catch 会得到包括非托管异常在内的所有内容,但也许我错了。

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

非常感谢您对避免这种情况的任何见解

【问题讨论】:

  • 您有多确定该用户真的使用了您的代码版本?看到这种情况发生,我会感到非常惊讶。
  • 乔恩这是一个很好的观点。我们最近发布了一些小更新。看着他正在使用的版本,我认为我正在查看正确的代码。但是我现在要返回存储库进行检查
  • 这就是为什么,如果软件是内部的,我更喜欢为甚至发布配置生成 PDB;它会为您提供行号,如果它们与最新源不匹配,则表明软件版本已过时。
  • @KeithS - 好点我没有考虑过,尽管在这种情况下用户正在使用上面的代码并且日志显示了这个以及未处理的异常
  • 堆栈跟踪表明来自用户代码的调用是直接对 Image.FromStream() 进行的。否则在 GetLibraryObjectImage(Guid guid) 和 Image.FromStream(Stream stream) 之间会有一个额外的 Image.FromFile() 调用。

标签: c# exception-handling try-catch


【解决方案1】:

正如 @KeithS 在 cmets 中提到的,堆栈跟踪显示异常源自 Image.FromStream 方法。您是否验证了导致该调用的所有代码都正确返回了预期的数据?文件路径必须存在(否则File.ReadAllBytes 会引发异常)并且MemoryStream 构造函数正在返回一个有效的流(或者它会引发异常),但内存流中的数据是否有可能不是t 实际上是一个图像?

另外,您可能想尝试改用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;
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 2017-02-23
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多