因为项目需要,用WebBrowser开发了一个内部专用的简单多页面浏览器,现在运行时偶尔回出现未知的异常错误(非法内存访问),这种错误很难跟踪,因为在调试时一切正常。
我现在的处理:
一、将WebBrowser的所有事件响应代码加了try...except;
二、给Application.OnException添加了一个异常处理方法,在异常次数超过指定的次数时将程序退出(如果不退出,会出现更多莫名其妙的错误)。这个方法也是不得已的方法。问题的关键是:不知道这些异常从何而来以及如何拦截并处理,希望各位帮忙看看有何解决办法

解决方案 »

  1.   

    如果在线程中使用,不论是不是WebBrowser的问题,也许是某一处发生了错误,都会导致地址错误。
    我在开发[csdn论坛浏览器]时也碰到这个问题,较好的做法是在线程的Execute中使用
    try
      ...
    except
      ....
    end;
    在debug状态,应该可以跟踪错误的~CSDN论坛浏览器:浏览、发帖、回复、结贴自动平均给分,下载地址:http://CoolSlob.ys168.com
      

  2.   

    回CoolSlob:
        首先感谢您的关注,其次说明一下我的程序没有使用多线程。我前面有提到和WebBrowser相关的操作全部加了try...except,并在此记录错误信息,
    通过错误信息记录可以看到所有异常都不是由我自己的操作代码中出现的(如果是那样
    我会记录在执行XXX操作时发生异常),而是未知的异常,一下是一段错误记录信息:2006-8-14 13:45:30 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:45:31 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:45:34 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:45:36 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:45:36 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:45:38 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:45:38 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:45:40 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:45:41 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:46:08 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:46:15 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:46:16 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:46:40 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:47:10 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:1814  系统错误信息:The specified resource name cannot be found in the image file
    2006-8-14 13:47:11 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:47:11 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:47:11 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:47:57 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:47:59 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:49:24 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:120  系统错误信息:This function is not supported on this system
    2006-8-14 13:49:27 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:49:29 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:1813  系统错误信息:The specified resource type cannot be found in the image file
    2006-8-14 13:49:30 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:0  系统错误信息:The operation completed successfully
    2006-8-14 13:49:30 发生如下未知的异常:
    Access violation at address 00000000. Read of address 00000000
    系统错误代码:1447  系统错误信息:The window does not have scroll bars
      

  3.   

    请创建一个使用WebBrowser的demo,把引发错误的操作步骤写清楚. email至[email protected]
    :)
      

  4.   

    回CoolSlob:
    建一个Demo容易,关键是不知道错误的来源和原因:(现在跟踪到这样一种出错的情况:
    将程序启动后打开网页,过一段时间不做任何操作(上厕所去了),回来后在网页上面点右键
    即出现异常,此时若切换到其他程序也会抛出异常。如果明天用户试用还报告错误,我发Demo给你帮我看看:)
      

  5.   

    To: CoolSlob
        给您发了Demo邮件,麻烦您抽出点时间帮忙看看,非常感谢:)
      

  6.   

    修改成这样看看~~~~
    procedure TClientList.Notify(Ptr: Pointer; Action: TListNotification);
    var
      Temp: TClientFrm;
    begin
      inherited;
      case Action of
    //    lnAdded: FItemIndex := Count - 1;
    //    lnExtracted: ;
        lnDeleted:
          begin
            Temp := Ptr;
            FreeAndNil(Temp);
    //        TClientFrm(Ptr).Free;
    Dec(FItemIndex);
    if (FItemIndex < 0) and (Count > 0) then
      FItemIndex := 0;
          end;
      end;
    end;
      

  7.   

    还有这里
          if IsNew then
            while ClientFrmList.IndexOf(ClientFrm) <> -1 do
            begin
              Memo1.Lines.Add(ClientFrm.Caption);
              Assert(ClientFrm <> nil);
              if TWebFrm(ClientFrm).CheckReadyState then
                Break;
              Application.ProcessMessages;
            end;当在执行上面的代码时, 又产生了DoTabsChange事件会怎么样?你不断地打开那3个“业务”,然后不断地(快速)关闭,就会发生地址错误,说明应用了不存在的对象。
    也许是对象释放了,WebBrowser或所在的From中的某个事件仍在执行CSDN论坛浏览器:浏览、发帖、回复、结贴自动平均给分,下载地址:http://CoolSlob.ys168.com
      

  8.   

    你可以看看下面代码的运行结果
    var
      obj: TObject;
    begin
      obj := TObject.Create;
      obj.Free;
      if obj <> nil then ShowMessage('<>nil');
    end;
      

  9.   

    非常感谢CoolSlob去掉TClientFrm(Ptr).Free;这句是可以解决问题了,可是这样的话
    由于没有释放窗体会导致程序内存占用不断上升啊
      

  10.   

    procedure TClientList.Notify(Ptr: Pointer; Action: TListNotification);
    var
      Temp: TClientFrm;
    begin
      inherited;
      case Action of
    //    lnAdded: FItemIndex := Count - 1;
    //    lnExtracted: ;
        lnDeleted:
          begin
            Temp := Ptr;<-------------------------------
            FreeAndNil(Temp); <------------------------
    //        TClientFrm(Ptr).Free;CSDN论坛浏览器:浏览、发帖、回复、结贴自动平均给分,下载地址:http://CoolSlob.ys168.com
      

  11.   

    To: CoolSlob
        采用这样的方法释放窗体还是会出错的,也试了很多别的方法来释放包含WEB的窗体,但是只要释放就出错,现在是没办法先用一个列表保存,等程序退出时一起释放,好歹程序可以用了。
    就是觉得特别别扭,难道释放一个WEB窗体这么难?
      

  12.   

    用EmbeddedWB代替WebBrowser吧,这个比WebBrowser强!,你可以删掉WebBrowser组件,加入EmbeddedWB组件,试试还有没有问题
    EmbeddedWB下载地址:http://www.bsalsa.com/
    有问题可以联系我,帮你看看
      

  13.   

    楼上的兄弟,这一套组建果然不赖,但是我下载下来安装以后好像缺了很多组件,你有全的话可否给我发一份?[email protected]
      

  14.   

    EmbeddedWB俺用过了,还是一样出错的
      

  15.   

    前一阵了也在写,后来听说IE7要放出来了,
    就停了。
    看看IE7,能不能满足自己的要求,再说。:)