Joe*_*Joe 27 c# naming exception-handling exception
我正在编写捕获此代码的代码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 );
}
}
Run Code Online (Sandbox Code Playgroud)
此代码是否为其用户所接受,或者是OutOfMemoryException出于特殊原因故意被抛出?
Han*_*ant 37
不,这是历史.在.NET出现之前,GDI +写了很长一段时间.它的SDK包装器是用C++编写的.C++中的例外情况是不确定的,并不是每个人都购买它们.谷歌没有例如.因此,要保持兼容,它会报告错误代码的问题.从来没有很好地扩展,库程序员将目标设定为故意限制可能的错误代码的数量,它减轻了客户端程序员必须报告它们的负担.
GDI +在黑桃中有这个问题,它只定义了20个错误代码.对于具有如此多外部依赖性的大量代码来说,这并不多.这本身就是一个问题,有很多方法可以搞乱图像文件.图书馆的错误报告无法完全覆盖它们.事实上,在.NET定义的标准异常派生类型之前很久就选择了这些错误代码,这当然没有帮助.
Status :: OutOfMemory错误代码被重载意味着不同的东西.有时它确实意味着内存不足,它无法分配足够的空间来存储位图位.遗憾的是,相同的错误代码报告了图像文件格式问题.这里的摩擦是它无法确定它从图像文件中读取的宽度*高度*像素是否有问题,因为位图没有足够的可用存储空间.或者,如果图像文件中的数据是垃圾.它假设图像文件不是垃圾,公平的电话,这是另一个程序的问题.所以OOM就是它的报道.
为完整起见,这些是错误代码:
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)
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6779 次 |
| 最近记录: |