请问我继承了一个类: 
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;

解决方案 »

  1.   

    MyClass := MyClass.Create('abc.txt'); 
      try
         //这里编译时为什么会有:Variable 'MyClass' might not have been 
         //initialized  的警告?
      except
        MyClass.Free;
      end;
      

  2.   

    MyClass := TMyClass.Create('abc.txt'); //你写错了。
     
    一般在构造函数中不用自己处理异常,除非你想屏蔽掉该异常警告而继续构造。
    构造函数中如果发生异常,delphi的管理机制会自动调用该类的析构函数,来释放已经被分配的资源,这也是在析构函数中一般推荐用free方法来释放对象的一个原因,这样可以保证只对已分配内存的对象进行释放。
      

  3.   

    还有://如果找不到 FileName 这个文件(并没有发生except),则不创建这个 CLASS 的实体,
    //这果又应该怎样写才不创建这个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;
      

  4.   

    object pascal和c++一样,当构造函数出现异常时,该类的实体将不会占用任何资源。