type TForm1 = class(TForm) btn1: TButton; procedure btn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } procedure AppException(Sender: TObject; E: Exception); public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.AppException(Sender: TObject; E: Exception); begin ShowMessage('aaa'); end;procedure TForm1.btn1Click(Sender: TObject); var a: array [0 .. 3] of Integer; I: Integer; begin for I := 0 to 11 do a[I] := 3; end;procedure TForm1.FormCreate(Sender: TObject); begin Application.OnException := AppException; end;
如果数组越界写入了数据,导致其它地址数据错误,造成内存紊乱,那么首先它是在【越界处的地址写入了】 而实际上运行中抛出了异常,它被检测到了,根本就没写入数据,没有所谓的【内存紊乱】只不过是Delphi的编译器默认没有打开【Range checking】而已,ctrl+shift+F11在Compilong中设置一下即可,也可以使用遇编译指令{$R+}打开。打开后,下面代码就可以被try except end捕获procedure TForm1.btn1Click(Sender: TObject); var A: array [0 .. 3] of Integer; I: Integer; begin try for I := 0 to 11 do A[I] := 3; except end; end;
打个比方,使用万能表测量电阻,电池无电了。还如何去测量呢?
type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure AppException(Sender: TObject; E: Exception);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
ShowMessage('aaa');
end;procedure TForm1.btn1Click(Sender: TObject);
var
a: array [0 .. 3] of Integer;
I: Integer;
begin
for I := 0 to 11 do
a[I] := 3;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := AppException;
end;
如果数组越界写入了数据,导致其它地址数据错误,造成内存紊乱,那么首先它是在【越界处的地址写入了】
而实际上运行中抛出了异常,它被检测到了,根本就没写入数据,没有所谓的【内存紊乱】只不过是Delphi的编译器默认没有打开【Range checking】而已,ctrl+shift+F11在Compilong中设置一下即可,也可以使用遇编译指令{$R+}打开。打开后,下面代码就可以被try except end捕获procedure TForm1.btn1Click(Sender: TObject);
var
A: array [0 .. 3] of Integer;
I: Integer;
begin
try
for I := 0 to 11 do
A[I] := 3;
except end;
end;