Нет, это история. 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)
};