CSharp - C# 是否存在 Image.FromFile 为无效图像格式引发OutOfMemoryException的原因?

  显示原文与译文双语对照的内容

我正在编写捕获 OutOfMemoryException的代码,并引发一个新的,更直观的异常:


///...


///<exception cref="FormatException">The file does not have a valid image format.</exception>


public static Image OpenImage( string filename )


{


 try


 {


 return Image.FromFile( filename );


 }


 catch( OutOfMemoryException ex )


 {


 throw new FormatException("The file does not have a valid image format.", ex );


 }


}



是否可以对它的用户接受这里代码,或者是为特定原因引发的OutOfMemoryException

时间: 原作者:

不是历史 GDI+ 在. NET 出现之前写了相当长的一段时间。 它的SDK包装是用 C++ 编写的。 异常是 C++ 中的问题,不是每个人都会购买。 例如Google不支持它。为了使它兼容,它报告了错误代码的问题。 图书馆程序员能够有意地限制错误代码的数量,从而减少了客户程序员的负担。

GDI+ 有这个问题,它只定义了 20个错误代码。 对于如此庞大的代码块,有这么多外部依赖项,这一点是不太重要的。 这本身就是一个问题,有一个很多的方法来解决一个图像文件。 图书馆报告的错误没有足够的粒度来覆盖它们。 事实上,在. NET 定义标准异常派生类型之前挑选这些错误代码的事实当然没有帮助。

Status::OutOfMemory 错误代码被重载,以表示不同的内容。 有时它确实意味着内存不足,它不能分配足够的空间来存储位图位。 遗憾的是,图像文件格式问题由相同的错误代码报告。 这里的摩擦是无法决定从图像文件读取宽度 * * 像素是否是一个问题。 或者图像文件中的数据为垃圾数据。 它假定图像文件不是垃圾,公平调用,这是另一个程序问题。 所以这就是它所报告的。

为完整起见,这些是错误代码:


enum Status


{


 Ok = 0,


 GenericError = 1,


 InvalidParameter = 2,


 OutOfMemory = 3,


 ObjectBusy = 4,


 InsufficientBuffer = 5,


 NotImplemented = 6,


 Win32Error = 7,


 WrongState = 8,


 Aborted = 9,


 FileNotFound = 10,


 ValueOverflow = 11,


 AccessDenied = 12,


 UnknownImageFormat = 13,


 FontFamilyNotFound = 14,


 FontStyleNotFound = 15,


 NotTrueTypeFont = 16,


 UnsupportedGdiplusVersion = 17,


 GdiplusNotInitialized = 18,


 PropertyNotFound = 19,


 PropertyNotSupported = 20,


#if (GDIPVER> = 0x0110)


 ProfileNotFound = 21,


#endif//(GDIPVER> = 0x0110)


};



原作者:
...