请问我继承了一个类:
TMyClass = Class(TObject)
public
constructor Create(FileName:string);
end;implementationconstructor TMyClass.Create(FileName: string);
begin
inherited Create;
if FileExists(FileName) then
try
DoSth; //如果这果失败,我应怎样处理呢?
except
//这果应该怎样写才不创建这个CLASS呢? freeAndNil(Self); 行吗?
end
else begin
//如果找不到 FileName 这个文件(并没有发生except),则不创建这个 CLASS 的实体,
//这果又应该怎样写才不创建这个CLASS呢?
end;
end;
另外:
procedure TForm1.Button1Click(Sender: TObject);
var
MyClass:TMyClass;
begin
try
MyClass := MyClass.Create('abc.txt');
//这里编译时为什么会有:Variable 'MyClass' might not have been
//initialized 的警告?
except
MyClass.Free;
end;
end;
TMyClass = Class(TObject)
public
constructor Create(FileName:string);
end;implementationconstructor TMyClass.Create(FileName: string);
begin
inherited Create;
if FileExists(FileName) then
try
DoSth; //如果这果失败,我应怎样处理呢?
except
//这果应该怎样写才不创建这个CLASS呢? freeAndNil(Self); 行吗?
end
else begin
//如果找不到 FileName 这个文件(并没有发生except),则不创建这个 CLASS 的实体,
//这果又应该怎样写才不创建这个CLASS呢?
end;
end;
另外:
procedure TForm1.Button1Click(Sender: TObject);
var
MyClass:TMyClass;
begin
try
MyClass := MyClass.Create('abc.txt');
//这里编译时为什么会有:Variable 'MyClass' might not have been
//initialized 的警告?
except
MyClass.Free;
end;
end;
解决方案 »
- 寻人:请问谁知道大富翁的下落?
- 下一版本的Delphi for Win32--Delphi Spacely(Delphi 2007)屏幕截图
- 是不是Table属性设置问题?
- delphi中制作的OCX在VB中调用出现问题(急急)
- (100分)求第三方控件?急
- 我需要建一个线程,在定时器中利用该线程定时处理数据,下面流程是否合理
- 关于PChar数据类型
- ERP实施工作前景
- 如何是窗体大小根据分辨率的不同自动调整,可以做到吗?
- delphi中edit1,edit2,edit3,edit4,edit5,通过随机函数覆值后,怎么让五个edit中内容都不一样呢?
- c语言头文件向pascal转换问题。
- NMFTP问题!!!!!!!!!
try
//这里编译时为什么会有:Variable 'MyClass' might not have been
//initialized 的警告?
except
MyClass.Free;
end;
一般在构造函数中不用自己处理异常,除非你想屏蔽掉该异常警告而继续构造。
构造函数中如果发生异常,delphi的管理机制会自动调用该类的析构函数,来释放已经被分配的资源,这也是在析构函数中一般推荐用free方法来释放对象的一个原因,这样可以保证只对已分配内存的对象进行释放。
//这果又应该怎样写才不创建这个CLASS呢?可以像这样:
constructor TMyClass.Create(...);
begin
if not FileExists(FileName) then
raise Exception.Create('...');
//other codes
end;procedure TForm1.Btn1_Click();
var
MyClass:TMyClass;
begin
MyClass:=TMyClass.Create();//如果在构造中出错,程序会自动退出该函数,并且析构函数也会自动被调用,如果不希望该异常显示出警告,可以在外面在加一个空的try except块,
try
MyClass.DoSth(..);//如果执行其它函数时发生异常,就需要使用try finally机制来确保析构函数被调用了。
finally
MyClass.Free;
end;
end;