try……except,try……finaly等,请高手给讲讲

解决方案 »

  1.   

    高手不敢当, 只能称为熟手罢了.在 try ... except 语句中的代码若运行时产生异常, 则捕获并不弹出错误信息.
    在 try ... finaly 语句中的代码若运行时产生异常, 则弹出错误信息.
    不管是否有异常都会执行 finaly ... end; 中的代码, 而 except ... end 代码只会产生异常时才执行.
      

  2.   

    用try ... except 就足够了
      

  3.   

    在except后面写你的提示信息就行了:)
      

  4.   

    fj218(fj218)  :自己先学好了再教别人!别误导别人!!
      

  5.   

    这是我自己学习异常的心得体会
    写法一:try
    语句1;
    except
    语句2;
    end;
    语句3;1、如果语句1没有出现异常,则接着运行语句3;
    2、如果语句1出现异常,则进入语句2进行判断;如果语句2中有对这一异常的响应,响应后接着运行语句3,如果没有对这一异常的响应则立即退出当前过程,向上一层继续抛出该异常,不会执行语句3;
    如语句2写成了
     on ExceptionType do ...;(...可以为空,即不写任何语句)
    则发生了ExceptionType异常(注:Exceptiontype代表某一具体异常如ERangeError)就会执行语句3,其他异常就会立即退出而不会执行语句3;
    如果语句2对所有异常进行响应则都会接着执行语句3。语句2对所有异常响应有以下写法:
    (1)、不用on Exceptiontype do语句,也可一句都不写为空;
    (2)、on Exception do ...; {...语句可写可不写};
    (3)、on ExceptionType do...else ...;{...语句可写可不写};
    (4)、on exceptiontype1 do...;
       on exceptiontype2 do...;
       on Exception do...;{以上...语句都可写可不写};
    ///////////////////////////////////////////////////
    写法二:try
    语句1;
    Finally
    语句2;
    end;
    语句3;不论语句1是否出现异常,语句2都会执行,但语句3在出现异常后不会执行
    ///////////////////////////////////////////////////
    写法三:try
      try
      语句1;
      exception
      语句2;
      end
    Finally
      语句3;
    end;
    语句4;
    1、如果语句1未出现异常,则会执行语句3接着执行语句4;
    2、如果语句1出现异常,则进入语句2进行判断,如果对这一异常进行了响应则会执行语句3接着执行语句4;
    如果对这一异常未响应则会执行语句3后退出当前过程,语句4不会执行;
    如果语句2对所有异常进行了响应(见例1)则会执行语句3接着执行语句4;///////////////////////////////////////////////////
    写法四:try
      try
      语句1;
      Finally
      语句2;
      end
    Except
      语句3;
    end;
    语句4;1、如果语句1未出现异常;则执行语句2,接着执行语句4;
    2、如果语句1出现异常,则会先执行语句2,接着进入语句3进行判断,如果对这一异常进行了响应则会执行语句4,如果对这一异常未响应则会立即退出当前过程,不会执行语句4;
      

  6.   

    忽略一切异常:
    try
      {写你的代码}  
    except
      {什么也不写}
    ;try……except,try……finaly最大的区别是:try……except出错后还会继续执行未执行完的代码,而try……finaly将会直接跳出当过未执行完的代码。
      

  7.   

    别听 fj218(fj218) 的finally 很有用典型的用法try
    //申请
    //......
    finally
    //释放
    end;
      

  8.   

    try
     //申请 
    except
      {什么也不写}
    ;
    //这里也可以释放正如delphi2java(delphi2java) 所说的
    try……except,try……finaly最大的区别是:
    try……except出错后还会继续执行未执行完的代码,而try……finaly将会直接跳出当过未执行完的代码。一般而言,程序出错后你总是希望将错误纠正以后让程序继续执行,所以用try...execpt足够了。
      

  9.   

    如果这样用就没有安全性可言了,真正的高手是不会这样写代码的。
    except段中是用来写自己处理错误代码的,即使不处理也要抛出异常到外部,让外部保护语句或WINDOWS来处理。
      

  10.   

    反对  fj218(fj218) :例如:
      try
        inifile1 := Tinifile.create('path+name');
        inifile1.……       ---------------------------->如果这里出错方案1、except
             inifile1.free;
           end;
           inifile1.free;方案2、finally
             inifile1.free;
           end;结果选择方案2,理由:方案一必须重复释放 inifile1,出错的几率大增;
                         方案二保证不出错!
      

  11.   

    方案1、except
             inifile1.free;//谁说要这一句呀?这里为空,什么都不写。
           end;
           inifile1.free;
      

  12.   

    写法一:
      inifile1 := TInifile.Create(AFileName);
      try
        // ... ... 
        // 如果这里出错
        // ... ... 
      except
      end;
      inifile1.Free;写法二:
      inifile1 := TInifile.Create(AFileName);
      try
        // ... ... 
        // 如果这里出错
        // ... ... 
      finally
        inifile1.Free;
      end;相同是: 
        写法一与写法二都能释放对象区别是: 
      1. 写法一不会弹出异常信息, 而写法二会弹出异常信息;
      2. 写法二比写法一运行代码要多, 效率没有写法一来得高.
      

  13.   

    // 要申请内存时:procedure TForm1.Button1Click(Sender: TObject);
    var
      StrLst: TStringList;
    begin
      StrLst := TStringList.Create;
      try
        try
          StrLst.LoadFromFile('C:\Text.txt');
        except
          ShowMessage('读取文件异常,可能是文件不存在!'); // 如果出错;
        end;
      finally
        StrLst.Free;              // 总是执行;
      end;
    end;// 不申请内存时:
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      try
        Memo1.Lines.LoadFromFile('C:\Text.txt');
      except
        ShowMessage('读取文件异常,可能是文件不存在!'); // 如果出错;
      end;
    end;
      

  14.   

    try
      // 执行相应的操作
     
    except on e:exception do
      //出现错误,显示错误信息
      showmessage(e.message) ;finally
      //一定要执行的部分,不管是否有错误发生!
      

  15.   

    一个完整例子
    function TADM.GetconnString:WideString;
    var MyFile:TIniFile;
        FileName:string;
    begin
     FileName:=ExtractFilePath(Application.ExeName)+'sconfig.ini';
     MyFile:=TiniFile.Create(filename);
     try
       try
         Result:='Provider='+MyFile.ReadString('DataBase','Provider','SQLOLEDB.1;');
         Result:=Result+'Persist Security Info='+MyFile.ReadString('DataBase','Persist Security Info','False;');
         Result:=Result+'User ID='+MyFile.ReadString('DataBase','User ID','sa;');
         Result:=Result+'Initial Catalog='+MyFile.ReadString('DataBase','Initial Catalog','SalaryII;');
         Result:=Result+'Data Source='+MyFile.ReadString('DataBase','Data Source','127.0.0.1;');
       finally
         MyFile.Free;
       end;
     except
       Application.MessageBox(Msg_ini_readerror,Msg_title_error,mb_ok+mb_iconerror);
     end;
    end;
      

  16.   

    我补充几点:
    1.在except子句中可以对异常类型进行判断,采取不同的异常处理。如,
      iZero := 0;
      try
        iValue := 5 div iZero;
      except
        on EIntOverflow do begin
          iValue := 0;
        end;
        on EIntError do begin
          iValue := 0;
        end;
        on EDivByZero do begin
          iValue := 0;
        end;
      end;
      但要注意,如果有多个异常接管块,且其中的异常有继承关系,超类的异常接管块应该放在子类异常接管块后面,否则子类异常接管块永远执行不到。比如上个例子中,EDivByZero异常接管不到,因为其父类EIntError先接管掉了。
    2.异常接管之后,如果我们无能为力处理这个异常,我们可以重新把这个异常抛出,甚至抛出另外类型异常。用raise关键字。
    3.kyee(浪子阿鹏) 关于对象释放的两种写法评价中,我有一些异议。
       1)首先我认为写法一是代码很危险的。除非你把所有异常接管掉,然后进行空处理。一旦有异常接管处理之后,就有可能会抛出新的异常(而且很多处理接管处理之后,会重新抛出异常,调用raise)。这个时候,紧接着的对象释放语句就得不到执行。自然就有错了。
       2) 是否会弹出异常,我们可以用TApplication的OnException事件来统一处理,是否要显示异常出错信息,不应该在业务处理的这个时候来决定。至于调试期间是否要弹出异常,可以在Delphi环境(Tools | Debug Options)中设置