Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

Неуловимый exception   Найти похожие ветки 

 
Kotka ©   (2004-07-21 00:11) [0]

Есть некая библиотека для сжатия данных. Для распаковки данных нужен такой код:
MyStream := TMemoryStream.Create;//обычный мемористрим
DCS:=TZDeCompressionStream.Create(mystream);//стрим из библиотеки
MyStream.Write(globinbuf, nowsize);//пишем в мемористрим распакуемые данные, которые находятся в globinbuf
i:=dcs.Size;//получаем размер распакованных данных
DCS.Read(globInBuf, i);//читаем распакованные данные уже из декомпрешн стрим
DCS.Free;//в комментариях не нуждается...
MyStream.Free;

Если данные повреждены, в строке MyStream.Write(globinbuf, nowsize); возникает эксепшн. Причем простым
try
MyStream.Write(globinbuf, nowsize);
except
end;

его не отловить! Просмотрев исходные коды библиотеки, видно, что эксепшн возникает в функции
function ZDecompressCheck(code: Integer): Integer;
begin
 Result := code;
 if code < 0 then
 begin
   raise EZDecompressionError.Create(_z_errmsg[2 - code]);//<--вот он, проказник!
 end;
end;

Эта функция в свою очередь вызывается из функции Seek того самого декомпрешн стрим. Каким образом вызывается эта функция и как отловить эксепшн?


 
Kotka ©   (2004-07-21 00:16) [1]

Каким образом вызывается функция Seek и как отловить эксепшн?


 
Digitman ©   (2004-07-21 08:38) [2]

что-то ты наблудил в коде ... нонсенс в алгоритме ...

InStream := TMemoryStream.Create;
try
 InStream.Write(globinbuf, nowsize);
 InStream.Position := 0;
 OutStream := TMemoryStream.Create;
 try
   DCS:=TZDeCompressionStream.Create(InStream);
   try
     try
       OutStream.CopyFrom(DCS);
     except
       Showmessage("Исключение !");
       raise;
     end;
   finally
     DCS.Free;
   end;
   ShowMessage("Данные распакованы в OutStream, размер распакованых данных = " + IntToStr(OutStream.Size));
   ... используем распакованные данные прежде чем OutStream будет уничтожен
 finally
   OutStream.Free;
 end;
finally
 InStream.Free;
end;

DCS:=TZDeCompressionStream.Create(mystream);

try
MyStream.Write(globinbuf, nowsize);
i:=dcs.Size;
DCS.Read(globInBuf, i);
DCS.Free;//в комментариях не нуждается...
MyStream.Free;
Если данные повреждены


 
Digitman ©   (2004-07-21 08:40) [3]

p.s.
все что ниже

InStream.Free;
end;

не читать - это очепятка


 
Kotka ©   (2004-07-21 15:01) [4]

... и вместо OutStream.CopyFrom(DCS) читать OutStream.CopyFrom(DCS,DCS.Size) ;)

Спасибо, все работает.


 
Digitman ©   (2004-07-21 15:09) [5]


> Kotka


ну да, разумеется, размер тоже нужен

p.s.

между прочим, пример использования поточных компрессоров/декомпрессоров есть в демо-каталоге в папке MIDAS\INTRCPT



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.031 c
3-1089027525
jenya_d
2004-07-05 15:38
2004.08.01
Утилиты администрирования MS SQL 2000


14-1089751778
Knight
2004-07-14 00:49
2004.08.01
Чё-то я туплю...


3-1089260339
Litr
2004-07-08 08:18
2004.08.01
ODBC и Jet 4.0


8-1084281034
jon
2004-05-11 17:10
2004.08.01
Как определить координаты мыши на форме


14-1089375182
Евген
2004-07-09 16:13
2004.08.01
как найти програмиста





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский