说得夸张点,差不多可以当作if来用?(打个比方而已)
比如,我在试图创建一个文件的时候,是不是应该用try来做这个事情?
这样如果没有建立成功,可以转到except里面去showmessage?
我试着这样做了一次,但是没有转入到except里面去……
所以有些奇怪了……
我看了一些例子,很多都是用on某个条件转入的,但是我并不知道会报什么错出来啊,on后面的东东怎么写呢?我就想问问,
try这个语法应该什么时候使用?
该如何使用?

解决方案 »

  1.   

    在可能发生错误而且错误原因可能不确定时用,如连接数据库服务器,连不上的原因可能有客户机的网线没插好,可能服务器停止运行。
    这事你就
    try
      连接数据库服务器
    execept
      报错:连接服务器失败!
    end;
    而if往往是条件明确时。
      

  2.   

    如果有可能失败并弹出异常的话,就应该使用比如:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      SL: TStringList;
    begin
      try
        StrToInt('ff'); //发生异常跳到EConvertError
        SL.SaveToFile('C'); //发生异常跳到Exception
      except
        on E: EConvertError do  //处理Try..Except之间的EConvertError异常
        begin
          ShowMessage('转换错误');
        end;
        on E: Exception do  //处理Try..Except之间的所有上面没有处理过的异常
        begin
          ShowMessage('其他错误');
        end;
      end;
    end;
      

  3.   

    agree with heluqing(鉴之小河〖挣大钱娶美女〗)
      

  4.   

    下面是个典型的应用,你可以看看...
    ----------------------------------------------
    try
                    ADOConnection1.BeginTrans;
                    ///////////////在数据库中删除相应字段的纪录
                    MyDataSet.CommandText:='Select Device_ID from Device where Device_IP=?;
                    MyDataSet.Parameters[0].Value:=TCRec.DeviceIP;
                    MyDataSet.Parameters[1].Value:=TCRec.DeviceNum;
                    MyDataSet.Active:=True;
                    if not MyDataSet.Eof then
                    begin
                        tempID:=MyDataSet.Fields[0].AsInteger;
                    end;
                    MyDataSet.Active:=False;                MyQuery.SQL.Add('Delete from TC10BE1 where TC10BE1_Device=?');
                    MyQuery.Parameters[0].Value:=tempID;
                    MyQuery.ExecSQL;
                    MyQuery.Close;                MyQuery.SQL.Clear;
                    MyQuery.SQL.Add('Delete from Device where Device_ID=?');
                    MyQuery.Parameters[0].Value:=tempID;
                    MyQuery.ExecSQL;
                    MyQuery.Close;
                    ///////////////数据库删除完成
                    ///////////////删除当前设备列表当中的设备纪录
                    DelDeviceList(TCRec.DeviceIP,TCRec.DeviceNum);
                    //////////////当前列表中的设备纪录删除成功
                    //////////////释放当前设备的图标资源
                    TCRec.Free;
                    //////////////图标资源释放成功
                    ADOConnection1.CommitTrans;            except
                    on E:Exception do
                    begin
                        showmessage('删除过程中发生错误:' + E.Message);
                        ADOConnection1.RollbackTrans;
                    end;
                end;
      

  5.   

    程序有可能出错时用.针对特定的错误的处理时用ON...不晓得会出什么错时.就不用ON...了.
      

  6.   

    虽然一直说写这个比较麻烦,外加就是程序的可看性会降低
    但我的观点是最好能写的地方就写,外加就是对异常的判断要区别对待,免得写多了try后不知道从哪里错了
      

  7.   

    我也觉得有可能有出错的时候就用这个比较好。
    但是不知道怎么使用成功。
    比如我试图创建一个目录的时候,procedure TForm1.Button1Click(Sender: TObject);
    begin
      try
        mkdir('x:\aaa')
      except
        showmessage('wrong!')
      end;
    end;就这么简单的一个试验,
    我机器没有X盘,但是创建的时候并没有跳转到except中去。
    这是怎么回事?
      

  8.   

    再问一句:
     postren(小虫)的例子中,
    except中,
    on E:
    这个条件是怎么回事?
    E代表什么?
      

  9.   

    我来解答第二个问题
    except中,
    on E:
    这个E指的是你的捕获异常的种类,当然你也可以用来代替,比如on abc:exception do
    而且可以在捕获不同的异常时异常的时候报不同的错误,比如:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    try
       edit1.Text:=inttostr(strtoint('ad'));
    except on a:EConvertError do
        edit1.Text:=a.Message;
        on b:EFOpenError do
         edit1.Text:=b.Message;end;
      

  10.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
        try
            mkdir('x:\aaa')
        except
            showmessage('wrong!')
        end;
    end;
    -------------------------
    上面这个我做了测试,我的会出现异常,也会执行
    showmessage的...你再试一下看看。
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
        try
            mkdir('x:\aaa')
        except
            //showmessage('wrong!');
            on E:Exception do
            begin
                showmessage(E.Message);
            end;
        end;
    end;
    ------------改成这样你就会看到错误提示:Invalid filename
      

  12.   

    谢谢大家指点。
    那就是说E这个变量是可以随意取的,
    对吧?不过还有个问题,
    上面的这段程序我执行还是有问题,
    没有任何提示框。
    难道是因为盗版delphi?
    我另开一个帖子讨论吧。
    顺便问问跟踪的东东。这个帖子先解了。
    不好意思,
    这个帖子分数太少了……