我写的一个COM的一个方法中:
try
  xxx
except
 on e:exception do
 begin
  raise;
 end;我写raise的目的是为了在COM的客户端捕获来处理这个错误,但是,每次执行到RAISE这句,就会出现这个错误:
Project xxxx raise exception class C000005 with message 'access violation at xxxx':read of address 0x0000'.Process stopped.
这个错误就是执行到raise出现的请问是为什么?在COM中这么写异常有什么问题吗?

解决方案 »

  1.   

    try
      xxx
    except
     on e:exception do
     begin
      ShowMessage(e.Message);  //看看这样行不行
     end;
    end;
      

  2.   

    楼上的,我已经说了,我的错误要传递到客户端去,你SHOWMSG,客户端会认为这个方法调用没有问题而捕获不到异常,我问的是用raise重新引发事件在COM中为什么要出错
      

  3.   

    raise重新引发事件等同于你没有用Try保护异常呀用自己定义的接口传递错误了
    例如Win32就喜欢用GetlastError的,呵呵function aa(..): boolean;
    ..
    result := false
    try
      xxx
      result:=true;
    except
    end;
      

  4.   

    raise是要产生一个异常,  后面要跟一个异常类的实例,自己定义地,或者系统自带的。
    例:  raise  TMyOwnException.Create();
      

  5.   

    ly_liuyang(Liu Yang) 说的很对了
      

  6.   

    远程无法直接传递异常的,可以通过自己提供机制来作
    比如
      try
        ...
      except
        on E: Exception do
          ReturnException(E);
      end;通过事件回调,或者发消息(对Com不是很熟悉,不清楚具体应该怎么样,效果应该就像是控件的一个Event一样)把异常传回客户端
    客户端这样写
      procedure OnServerException(e: Exception);
      begin
        raise e;
      end;
    这个要求客户端和服务端都有这个异常的声明,如果你对异常只是要求返回一个说明的话,那么只需要传回名字和message就可以了。
      

  7.   

    以后不准备用DELPHI做COM了,累!要对付COM还要对付DELPHI,不如直接用ATL算了。