Форум: "Начинающим";
Текущий архив: 2011.11.06;
Скачать: [xml.tar.bz2];
ВнизJPEG error + on E: Exception Найти похожие ветки
← →
SIV5000 (2011-07-12 16:36) [0]Народ привет. Подскажите пожалуйста как обработать Exception при загружке попорченого JPEG файла (exception class EJPEG with message "JPEG error #42".).
Кажеться правильно но что интересно так ето то что ошибка возникает не при JPG.LoadFromFile а при Image1.Picture.Assign.
var
JPG:TJpegImage;
begin
JPG:= TJpegImage.Create;
JPG.LoadFromFile("C:\Sony\DSC05107.jpg");
try
Image1.Picture.Assign(JPG);
except
on E: Exception do begin
JPG.free;
end;
end;
JPG.free;
end;
← →
MBo © (2011-07-12 16:40) [1]в данном случае не видно, чтобы какие-то особые действия при исключения делались, так что try-finally будет разумно использовать.
← →
Юрий Зотов © (2011-07-12 16:41) [2]
JPG:= TJpegImage.Create;
try
JPG.LoadFromFile("C:\Sony\DSC05107.jpg");
Image1.Picture.Assign(JPG);
finally
JPG.free;
end;
← →
SIV5000 (2011-07-12 20:48) [3]
> в данном случае не видно, чтобы какие-то особые
Ну это так, упрощенный вариант, самая "Суть"
> Юрий Зотов
Нифига. JPG то освобождаеться, но выдает окно с "JPEG error #42". Окно то и должно по идее в "except on E: Exception" не появляться (что мне и надо).
Просто уже есть похожий код для обаботки иконки но там Exception перехватываеться и все ОК. А с .jpg какая то фигня. Вот с иконками Exception выплывает сразу после неудачной загрузки а с .jpg только когда Assign.
Может виноват TImage, но тут он просто для примера а на самом деле использую TBitmap.Assign(TJpegImage). Итам тот же результат !!!
Так как же ето сделать???
← →
DVM © (2011-07-12 21:01) [4]
> Вот с иконками Exception выплывает сразу после неудачной
> загрузки а с .jpg только когда Assign.
декодирование происходит в этот момент вероятно, а до этого момента JPEG данные просто лежат в Stream
← →
SIV5000 (2011-07-12 22:59) [5]Короч. Заметил что глюк этот только (пока что) с "JPEG error #42". С другими ошибками не наблюдаеться.
Експеремент:
Открываю блокнот и сохраняю текстовой файл с расширением .jpg (пусть будет 000.jpg)
Вот такой вариант кода работает если ошибка "JPEG error #53"
var
JPG:TJpegImage;
begin
JPG:= TJpegImage.Create;
try
JPG.LoadFromFile("C:\Sony\000.jpg"); но возникает Exception здесь, при загрузке, а при ошибке #42 - в следующей строчке
Image1.Picture.Assign(JPG);
except
on E:Exception do begin
JPG.LoadFromFile("D:\Pictures\Films\ph-10167.jpg");
Image1.Picture.Assign(JPG);
end;
end;
JPG.Free;
end;
Так как же отловить это?
Могу скинуть ту попорченую картинку с примером, если поможет.
← →
Andy BitOff © (2011-07-12 23:19) [6]> Так как же отловить это?
http://www.codenet.ru/progr/formt/jpeg_13.php
← →
Юрий Зотов © (2011-07-13 13:21) [7]> SIV5000 (12.07.11 20:48) [3]
> Окно то и должно по идее в "except on E: Exception" не появляться (что мне и надо).
Прятать ошибки - это ОЧЕНЬ плохая практика.
← →
Slym © (2011-07-14 08:42) [8]не нравится - юзай другое и быстрее и менее глючно
http://software.intel.com/en-us/articles/intel-integrated-performance-primitives-intel-ipp-jpeg-sample-and-performance-faqs/
← →
SIV5000 (2011-07-14 11:30) [9]
> Юрий Зотов - Прятать ошибки - это ОЧЕНЬ плохая практика.
Ну почему же прятать ОШИБКИ? Я хочу спрятать окно Exception а ошибку конечно же обработать.
Спасибо за помощь, но нашел самый простой способ - просто проверить ширину или высоту JPG. У попорченого JPG W или H = 0.
← →
Юрий Зотов © (2011-07-14 23:03) [10]> SIV5000 (14.07.11 11:30) [9]
> У попорченого JPG W или H = 0.
Откуда такая уверенность? От того, что Вы проверили это на несчастном десятке попорченных файлов? Но это же ничего не доказывает (тем более, если весь этот десяток Вы делали одним и тем же способом - в блокноте).
Завтра запросто встретится попорченный файл с ненулевыми W и H - и что тогда делать бедняге программе?
Признаком попорченного файла является не W=0 и не H=0. Им является сам факт возникновения исключения. Поэтому не надо ничего проверять - надо поймать исключение и выдать понятное человеку сообщение. И еще надо позаботиться, чтобы при этом не было утечки памяти.
А больше НИЧЕГО делать не нужно.
← →
SIV5000 (2011-07-15 00:48) [11]
> Юрий Зотов
Да я с Вами согласен что ситуации бывают разные. Может немного не так написал, но W = 0 и H = 0 я имел в виду именно у попорченого файла а не у того который был "сделан" в блокноте.
Просто как я уже обьяснял, и для чего делал такой експеримент, так просто что б наглядно показать что почему то "JPEG error #53" возможно обработать в Exception а "JPEG error #42" нет. Вот и по этому спрашиваю ПОЧЕМУ ТАК????
Ну а уже методом "втыка" получилось эту проблему хоть как то решить.
> надо поймать исключение и выдать понятное человеку сообщение
Вот как раз таки не надо ничего выдавать! Поймать, обработать так что б прога не зависла. Да, может в некоторых програмах это нужно, но только в тех ситуациях где человеку это нужно знать (например аудио плеэр выдаст окно что попорчен аудио файл).
В моем варианте ничего выводить не надо, просто вместо попорченой картинки загрузить другую из ресурса, рисунок которой говорит что програма не может обработать файл.
← →
Германн © (2011-07-15 01:59) [12]
> Просто как я уже обьяснял, и для чего делал такой експеримент,
> так просто что б наглядно показать что почему то "JPEG
> error #53" возможно обработать в Exception а "JPEG error
> #42" нет. Вот и по этому спрашиваю ПОЧЕМУ ТАК????
А я таки и не понял в чём разница между этими ошибками?
Какая нафиг разница в какой строке защищённого блока возникает исключение?
> В моем варианте ничего выводить не надо, просто вместо попорченой
> картинки загрузить другую из ресурса, рисунок которой говорит
> что програма не может обработать файл.
>
А почему программа не может обработать сей файл тебе не интересно.
Тебя бы, хотя бы на месяц сунуть в обычно-нормальную техподдержку! :)
P.S.
Есть и другие варианты, кроме техподдержки. Стройбат, например. :)
← →
SIV5000 (2011-07-15 12:51) [13]Удалено модератором
Примечание: Выражения выбираем, не в пивной
← →
Dennis I. Komarov © (2011-07-15 14:29) [14]
> Нифига. JPG то освобождаеться, но
А не подумал, что в блоке exeption тоже может быть исключение, а по сему Free не отработает - вот и утечка.
См. [2] и делай так всегда...
Взрослые дяди в голубых штанах говорят не делай так, так ведь нет...
З.Ы.
Где же ИШ, я буду ленту подавать ;)
← →
sniknik © (2011-07-15 14:30) [15]>> А я таки и не понял в чём разница между этими ошибками?
> Ответ: НОМЕР ОШИБКИ.
он не дальтоник чтобы номера не различать... не понятны твои слова, в чем ТЫ видишь различия, что когда. и как, работает, а когда и как нет. в зависимости от номера.
> При одинаковом коде если возникает Exception с "JPEG error #53" то все возможно обработать а при этом же коде но при Exception с "JPEG error #42" ничего не получаеться?
вот вот, именно про это, что значит "все возможно обработать", и что "ничего не получаеться"???
вот же в [5] написано -
> Вот такой вариант кода работает если ошибка "JPEG error #53"
> ...
> JPG.LoadFromFile("C:\Sony\000.jpg"); но возникает Exception здесь, при загрузке, а при ошибке #42 - в следующей строчке
т.е. "все" работает, если речь все еще про обработку эксепта... разница только в том, что на разных строках.
но тут ничего удивительного, представь архив...(jpeg в какойто мере он и есть), пытаешься считать сам файл получаешь дисковую ошибку(нет доступа/порушен диск/...), после пытаешься архив "развернуть" получаешь ошибку этого действия (порушена структура/не сошелся CRC/...).
в чем проблема то?
> никто не знает как
и не знаю, и знать не хочу... т.к. при правильной работе на это пофиг. никогда не возникнет нужда "вникать в нюансы".
← →
SIV5000 (2011-07-15 16:08) [16]Ну давайте сначала. Програма создает превюшки (Thumbnails) .JPG файлов.
Ясно? Думаю да.
Теперь. Бывают ситуации когда файлы тем или иным способом стают попорчеными. Тоесть либо не полностью скопированые либо комп выбило либо какой то чувак изменил расширение допустим .bmp на .jpg (не знаю почему, может небило что делать).
Ну это тоже должно быть понятно. Так что сюда думаю Вам не нужно возвращаться.
Переходим к обработке наших кртинок.
Допустим мы создали список картинок и начинаем загружать их по очереди, делать ресамплинг и сохранять уменьшеную копию картинки в наш ранее придуманый обьект.
Но, в процесе загрузки у нас возникает ошибка, прога подает последние признаки жизни в виде месседжа и "погибает".
Что же делать? Почему ей пришел каюк?
Причиной стал "попорченый" файл. Но "попорченым" он может быть как я уже выше писал ("либо не полностью скопированые либо комп выбило либо какой то чувак изменил расширение допустим .bmp на .jpg") .
Но какая именно ошибка, нам поможет Exception ведь для того он и нужен!!!
Что же делает Exception???
Exception дает нам шанс спасти нашу програму без перезапуска + Exception возникает при какой то КОНКРЕТНОЙ ситуации, а значит он ЗНАЕТ ЧТО ИМЕННО случилось и в своем месседже говорит:"JPEG error #53".
Немного поискав по нету можно узнать что "JPEG error #53" возникает когда файл с расширением .jpg имеет Header не JPEG файла. тоесть он не являеться .jpg файлом.
Зная с чем мы столкнулись, что б не говорить юзеру: "Чувак! Не могу заргузить файл" каждый раз и выкидать кучу месседжов мы обрабатываем наш Exception вот так вот:
on E:Exception do begin
ну к примеру загружаем просто другую картинку или вообще игнорируем етот файл, если что то создавали раньше то освобождаем.
Ну Вы должны быть в курсе.
И САМОЕ ГЛАВНОЕ: ПРОГА НЕ ВЫДАЕТ МЕССЕДЖИ, НЕ НАДОЕДАЕТ ЮЗЕРУ
end;
Но так бывает с JPEG error под номером 53.
Здесь все прикрасно работает.
Теперь идя в цикле, переходим к следующему файле.
Блин. Опять Exception!!!
Ну что ж. Мы уже знаем как ее обработать и НЕ БЕСПОКОИТЬ ЮЗЕРА!!!
Ага, ничего подобного, потому что на этот раз у нас "JPEG error #42" (ПОД НОМЕРОМ 42) но прога не виснет, все что нужно освободить у нас освобождаеться, УТЕЧКИ МОЗГОВ НЕТ.
Но одна проблема все же есть: ВЫПЛЫВАЕТ МЕССЕДЖ. А если таких файлов 100 штук то бедный юзер палец сломает от кликов.
Ну а зачем Юзеру вообще выдет етот Меседж????? Он что поможет этому файлу???????? Ну да если делать правильно то можно просто в лог добавить все попорченные файлы.
Допустим я так и хочу сделать. Но у меня ПОЧЕМУ ТО НЕ ПОЛУЧАЕТЬСЯ.
А ПОЧЕМУ? Если "JPEG error #53" удалось обработать, то "JPEG error #42" ВЫДАЕТ МЕССЕДЖ постоянно что бы не делал?
И тогда я ришаю написать на форуме. Пишу что хочу сделать, что получилось что нет, логично представляю всю ситуацию, и никто НИЧЕГО НЕ МОЖЕТ ПОНЯТЬ.
тогда я беру и Разжовую все по порядку.
А теперь как говорит Сергей Шнуров "СУТЬ":
Обьясните - ПОЧЕМУ при "JPEG error #53" удаеться не ТРИВОЖИТЬ ЮЗЕРА МЕССЕДЖАМИ а при "JPEG error #42" ну КТО ТО СИДИТ ТАМ И ВЫКИДЫВАЕТ ЭТИ МЕССЕДЖИ??? и помогите их УБРАТЬ!!!!
← →
sniknik © (2011-07-15 16:50) [17]> Но у меня ПОЧЕМУ ТО НЕ ПОЛУЧАЕТЬСЯ.
КАК ПРОБОВАЛ?
> Если "JPEG error #53" удалось обработать, то "JPEG error #42" ВЫДАЕТ МЕССЕДЖ постоянно что бы не делал?
ЧТО ДЕЛАЛ?
и еще ГДЕ ДЕЛАЛ?
про то что ошибка может быть разная (на примере архива выше), от чтения/разбора/т.д. проигнорировал? 42 это вроде (по гуглю) ошибка чтения из стрима.
т.е. если ты ее пытаешься ловить на открытии файла, то нифига не выйдет, там еще данные из стрима в стрим не перекладываются.
а то что ее вообще отловить не получается, это ты извиняюсь врешь. вот к примеру показательный топик, из того же гугля
http://www.commfort.com/ru/forum/viewtopic.php?f=3&t=4160[02.11.2008 - 21:06:53] Связь с сервером установлена
[02.11.2008 - 23:19:05] Application error: "JPEG error #53"
[02.11.2008 - 23:19:09] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:19:27] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:19:34] Application error: "JPEG error #53"
[02.11.2008 - 23:19:38] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:21:19] Application error: "JPEG error #42"
[02.11.2008 - 23:21:30] Application error: "JPEG error #42"
[02.11.2008 - 23:22:31] Application error: "JPEG error #42"
[02.11.2008 - 23:22:34] Application error: "JPEG error #53"
[02.11.2008 - 23:22:44] Application error: "JPEG error #53"
[02.11.2008 - 23:22:45] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:22:49] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:22:50] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:29:15] Application error: "JPEG error #42"
как видно ошибки 53 и 42 соседствуют в логе, и перехвачены единообразно... правда судя по всему от от аппликейшина.
что возвращает к вопросу ГДЕ ДЕЛАЛ? КАК ДЕЛАЛ?
p.s. поменьше эмоций и собственных рассуждений (если бы помогали сам бы все решил), побольше понятных (как для "дурака") фактов, и кода.
p.p.s.
> Могу скинуть ту попорченую картинку с примером, если поможет.
а выложить на файлообменник не судьба? просто, если это не "напряжно" кто то может и посмотрит, а давая мыло для "скидывания" как бы "подписываешься" а это "ну его нафиг" (тут кстати ИШ ссылочку "как задавать вопросы" всем раздает... наизусть ее нужно обязать учить... ИМХО)
← →
Dennis I. Komarov © (2011-07-15 16:51) [18]
> Вот такой вариант кода работает если ошибка "JPEG error
> #53"
> var
> JPG:TJpegImage;
> begin
> JPG:= TJpegImage.Create;
> try
> JPG.LoadFromFile("C:\Sony\000.jpg"); но возникает Exception
> здесь, при загрузке, а при ошибке #42 - в следующей строчке
> Image1.Picture.Assign(JPG);
> except
> on E:Exception do begin
> JPG.LoadFromFile("D:\Pictures\Films\ph-10167.jpg");
> Image1.Picture.Assign(JPG);> end;
> end;
> JPG.Free;
> end;
Почему сдесь не может возникнуть исключение?
← →
Dennis I. Komarov © (2011-07-15 16:55) [19]сорри, здесь :(
← →
sniknik © (2011-07-15 17:17) [20]> Вот такой вариант кода работает если ошибка "JPEG error #53"
> var
> JPG:TJpegImage;
> begin
> JPG:= TJpegImage.Create;
> try
> JPG.LoadFromFile("C:\Sony\000.jpg"); но возникает Exception здесь, при загрузке, а при ошибке #42 - в следующей строчке
> Image1.Picture.Assign(JPG);
> except
> on E:Exception do begin
> JPG.LoadFromFile("D:\Pictures\Films\ph-10167.jpg");
> Image1.Picture.Assign(JPG);
> end;
> end;
> JPG.Free;
> end;
приведя в порядок, и убрав лишнее...var
JPG:TJpegImage;
begin
try
JPG:= TJpegImage.Create;
try
JPG.LoadFromFile("C:\Sony\000.jpg");
Image1.Picture.Assign(JPG);
finally
JPG.Free;
end;
except
{осознанное сокрытие...}
end;
ShowMessage("Если не это показывает, то все ОК, все отловили...");
end;
сообщение последнее видишь? при 53? при 42?
← →
Inovet © (2011-07-15 18:20) [21]> [16] SIV5000 (15.07.11 16:08)
> Ну да если делать правильно то можно просто в лог добавить все попорченные файлы.
Как вариант, можно сообщение вместо картинки в превью вывести. Только они разные могут быть от испорченного файла, заблокированного другим приложением и до физического отказа диска. Наверно правильнее их по разному обработать? - где-то в превью написать, а где-то и сообщение выдать с кнопками "Продолжить", "Прервать".
← →
Sapersky (2011-07-15 18:49) [22]Я бы тоже рекомендовал другую библиотеку, хотя бы GDI+. "Битые" jpeg она неплохо грузит (если есть полфайла - загрузит эту половину), да и побыстрее стандартного модуля. И вроде бы там есть готовые функции для генерации тумбнэйлов.
← →
~ (2011-07-15 20:25) [23]jpeg dcu юзаем? угу нятно.
1. Версия делфей не указана.
2. Эта юнита глючная. Я сам с ней в свое время замучился. Хотел кидать через порт "толпу" превьюшек.... Пришлось остановиться на пожатых бмпешках. Так что попробуте другие средства обработки jpg
ps/ вообще чудесатая юнита )
← →
SIV5000 (2011-07-15 22:13) [24]
> jpeg dcu юзаем?
Угу :)
> sniknik: а то что ее вообще отловить не получается, это ты извиняюсь
> врешь. вот к примеру показательный топик, из того же гугля
Я к 53 ничего не имею. он ловиться а вот 42 нет.
> а выложить на файлообменник не судьба? просто, если это
> не "напряжно" кто то может и посмотрит, а давая мыло для
> "скидывания" как бы "подписываешься" а это "ну его нафиг"
> (тут кстати ИШ ссылочку "как задавать вопросы" всем раздает.
> .. наизусть ее нужно обязать учить... ИМХО)
Ich "understand" du nicht! :)
Короч. Народ гляньте там должно быть понятно.
http://depositfiles.com/files/1easx1z7w
← →
sniknik © (2011-07-16 13:23) [25][20]
+
...
Image1.Picture.Assign(JPG);
Image1.Refresh;
...
уже говорил что ошибка может быть от разных действий, тока примеры другие, тут дает не загрузке/присвоении а на отрисовке, после выполнения процедуры. т.е. рисуем "в блоке", и все дела.
> :)
зря иронизируешь, все проблема "на 5 мин", но из-за постановки вопроса проблема в том чтобы понять в чем проблема... и неважно что ты понимаешь, важно чтобы руководствовался этим.
← →
SIV5000 (2011-07-16 14:51) [26]
> sniknik
Спасибо. Какая то мелочь но столько времени заняло..... :)
Просто в следующий раз, если возможно будет, то буду сразу же пример викладывать потому что обьяснение реально занимает МНОГО времени и усилий :) И самое главной что задело так то что кроме try ...finally и try ... except (на сколько я знаю) ничем больше не воспользоваться и оно не помагало. Ну вот так вот.
← →
sniknik © (2011-07-16 15:36) [27]> кроме try ...finally и try ... except (на сколько я знаю) ничем больше не воспользоваться
Application.OnException
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.11.06;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.004 c