Форум: "Потрепаться";
Текущий архив: 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