比如:
窗体1ShowModal出来了一个窗口,然后这个窗口的某个事件抛出的异常,我想在窗体1的处理代码中捕获都不行呢
procedure TForm1.Button1Click(Sender: TObject);
begin
 try
  Form2 := TForm2.Create(Application);
  Form2.ShowModal;
 except
    on e:exception do
    begin
      ShowMessage(e.Message);
    end;
 end;
end;procedure TForm2.Button1Click(Sender: TObject);
begin
  raise Exception.Create('Test');
end;我测试了,好像在TForm1中捕获不到TForm2中的异常啊。

解决方案 »

  1.   

    好象没办法,你要是用Form2.Show;倒是应该能捕捉到...
      

  2.   

    Unit1中:
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        procedure ApplicationEvents1Exception(Sender: TObject; E: Exception);
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    try 
      Form2 := TForm2.Create(Application); 
      Form2.ShowModal; 
    except 
        on e:exception do
        begin
          ShowMessage(e.Message);
        end; 
    end; 
    end;procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
    begin
        ShowMessage('捕获到的异常: ' + E.Message);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        Application.OnException := ApplicationEvents1Exception;
    end;
      

  3.   

    Form2 := TForm2.Create(Application); 
    try 
      Form2.ShowModal; 
    except 
      on e:exception do 
      begin 
        ShowMessage(e.Message); 
      end; 
    end; 
    //------一般来说,应该这样写,楼主那样写,编译器会有Hints.
    或者下面这样写个人感觉更好.
    Form2 := TForm2.Create(nil);
    try 
    try 
      Form2.ShowModal; 
    except 
      on e:exception do 
      begin 
        ShowMessage(e.Message); 
      end; 
    end; 
    finally
      Form2.Free;
    end;
      

  4.   

    多谢ccrun老大,你的方法基本可以。但delphi的help有说,这种方法不能处理Application.Run之前或之后的
    异常的。我其实想这样写
      Application.Initialize;
      try
        if UserLogin then
        begin
          Application.CreateForm(TDM_Skin, DM_Skin);
          Application.CreateForm(TDM_Data, DM_Data);
          Application.CreateForm(TForm_Main, Form_Main);
          Application.Run;
        end;
      except
        on e:Exception do
        begin
          LogError(e.Message);
          ShowErrMsg(0, e.Message);
        end;
      end;
    我的本意是在一个地方捕捉到所有异常,看了一下vcl的源码,这种想法是不可能的。Run方法自己都有处理异常,
    所以,有异常都不会继续发上来了。
    delphi这种处理有利也有弊啊,如果不做处理的话,新手编个程序稍微有个异常,程序就当掉了,但有时候程序员
    的确想全部控制procedure TApplication.Run;
    ...
          repeat
            try
              HandleMessage;
            except
              HandleException(Self);
            end;
          until Terminated;
    ...
    它已经处理了
      

  5.   

    Mark除主窗口之外的窗口在需要用到的时候再去Create 就是在Run之后了吧是不是就可以探测到Exception呢
      

  6.   


    不,就像上面的代码,我需要先显示登录窗口,再显示主窗口
    我的UserLogin是个函数,就是showmodal一个登录窗口
      

  7.   

    procedure TApplication.Run;
    ...
          repeat
            try
              HandleMessage;
            except
              HandleException(Self);
            end;
          until Terminated;
    ...
    它已经处理了