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

Вниз

Ну тогда еще задачка:   Найти похожие ветки 

 
Алексей Петров   (2002-02-07 10:09) [23]

Еще немного. Меня несколько удивило, что EAssertFailure не содержит отдельно имени pas файла и № строки, а только в виде сообщения.

Обратите внимание, что обработкой Assert можно управлять самим. Я лично использовал Assert совершенно нетривиальным образом: Мне нужно было организовать трасиировку нескольких потоков и я перекрыл AssertErrorHanler на код, пишуший в лог что поток прошел через указанную точку, а Exception не генерировал.
После этого повсеместно в коде потока были расставлены Assert(False). - может кому идея пригодится :)

А вот код, демонстрирующий подмену обработки:

unit Assertions;

interface
uses
SysUtils;

type
EAssertionWithDetail = class(EAssertionFailed)
protected
FUnitName: string;
FLineNumber: Integer;
public
constructor Create(const Message, Filename: AnsiString; LineNumber: Integer);
property UnitName: string read FUnitName;
property LineNumber: Integer read FLineNumber;
end;

implementation
uses
SysConst;

{ EAssertionWithDetail }
function CreateAssertException(const Message, Filename: string;
LineNumber: Integer): Exception;
var
S: string;
begin
if Message <> "" then S := Message else S := SAssertionFailed;
Result := EAssertionWithDetail.Create(S, Filename, LineNumber);
end;

procedure RaiseAssertException(const E: Exception; const ErrorAddr, ErrorStack: Pointer);
asm
MOV ESP,ECX
MOV [ESP],EDX
MOV EBP,[EBP]
JMP System.@RaiseExcept
end;

procedure AssertErrorHandler(const Message, Filename: string;
LineNumber: Integer; ErrorAddr: Pointer);
var
E: Exception;
begin
E := CreateAssertException(Message, Filename, LineNumber);
RaiseAssertException(E, ErrorAddr, PChar(@ErrorAddr)+4);
end;

constructor EAssertionWithDetail.Create(const Message,
Filename: AnsiString; LineNumber: Integer);
begin
inherited Create(Format(SAssertError,[Message, Filename, LineNumber]));
FUnitName := FileName;
FLineNumber := LineNumber;
end;

initialization
AssertErrorProc := @AssertErrorHandler;
finalization
AssertErrorProc := nil;
end.



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

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

Наверх





Память: 0.45 MB
Время: 0.005 c
1-66914
Kozhanov
2002-03-04 11:30
2002.03.21
Задержка повторения символа.


1-66845
Mishka
2002-03-07 20:56
2002.03.21
Постоянно висящие Hintы


6-66952
Alex
2002-01-05 19:50
2002.03.21
Help Me!!!!


1-66858
Юный техник
2002-03-05 16:14
2002.03.21
Текст


1-66832
UnDISCOvery
2002-03-07 16:59
2002.03.21
С Дельфой хорошо, без Дельфы плохо ! :)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский