Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.21;
Скачать: CL | DM;

Вниз

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

 
Алексей Петров ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.014 c
14-66959
JohnnyCrisJoe
2002-02-06 01:35
2002.03.21
Роджер Желязны и его влияние на сознание людей..


1-66861
fag2000@ok.ru
2002-03-05 16:21
2002.03.21
Где можно найти пример HOOK а на мышь?


1-66937
Reals
2002-03-06 16:15
2002.03.21
Как перейти на споледнюю строчку текстового файла и прочитать ее.


3-66736
dmitriyk
2002-02-18 02:49
2002.03.21
Никто не встречал компонент TDBGrid у которог можно былобы вставить фоновую картинку ?


14-67010
dip56245
2002-02-07 23:10
2002.03.21
pascal