Необработанное исключение из Try - Catch Block - PullRequest
1 голос
/ 12 октября 2011

Я смотрел на другие вопросы, связанные с этой проблемой, но я не вижу ответа, который помогает мне (или, может быть, более подробно, насколько я понимаю).

Этот код:

   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");
        }

предназначен для работы с любой ситуацией, в которой файл изображения не найден или недействителен каким-либо другим способом.Я не идентифицировал какой-либо конкретный тип исключения в надежде, что он поймает что-либо.

Для одного из моих пользователей он выдал это исключение:

Неверный параметр.
В системе.Drawing.*

Я видел это раньше в других ситуациях в блоках try-catch, где обрабатываются изображения.Я думал, что вышеупомянутый try-catch получит все, включая неуправляемые исключения, но, возможно, я ошибаюсь.

Я понятия не имею об обстоятельствах, вызывающих исключение, но я действительно не хочу, чтобы мое приложение зависало и даже сгоралоесли я пытаюсь справиться с проблемами.Он был пойман моим глобальным обработчиком исключений, но, конечно, к тому времени уже немного поздно.

Большое спасибо за понимание того, как избежать этого

1 Ответ

1 голос
/ 12 октября 2011

Как упоминалось в комментариях @KeithS, трассировка стека показывает, что исключение происходит в методе Image.FromStream.Вы убедились, что весь код, ведущий к этому вызову, правильно возвращает ожидаемые данные?Путь к файлу должен существовать (или File.ReadAllBytes вызвал бы исключение), а конструктор MemoryStream возвращает допустимый поток (или он вызвал бы исключение), но возможно ли, что данные в потоке памяти не 'На самом деле это изображение?

Кроме того, вы можете попробовать использовать метод File.OpenRead.Это возвращает FileStream, так что вы можете передать это непосредственно в Image.FromStream метод.Это будет похоже на следующий код.(Я немного изменил его, чтобы использовать оператор using и иметь только один оператор возврата.)

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;
} 
...