【发布时间】: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