如何:创建可由远程对象引发的异常类型

您可以通过从 RemotingException 类派生并实现 ISerializable 接口,创建您自己的异常类型,该异常类型可由远程对象引发并由远程调用方捕获。

创建可由远程对象引发并由远程调用方捕获的异常类型

  1. 1.定义一个从 RemotingException 类派生的类。

    Public Class RemotableType
       Inherits MarshalByRefObject
    End Class 'RemotableType
    
    public class RemotableType : MarshalByRefObject{
    }
    
  2. SerializableAttribute 属性放置在该类上。

    <Serializable()> Public Class CustomRemotableException
        Inherits RemotingException
        …
    End Class
    
    [Serializable]
    public class CustomRemotableException : RemotingException, ISerializable {
        …
    }
    
  3. 实现一个采用 SerializationInfo 对象和 StreamingContext 对象作为参数的反序列化构造函数。

示例

以下代码示例提供了一种简单的实现,如果正确配置,该实现将在被远程服务器对象引发时复制回调用方。

<Serializable()> Public Class CustomRemotableException
  Inherits RemotingException
  Private _internalMessage As String
  Public Sub CustomRemotableException()
      _internalMessage = String.Empty
  End Sub

  Public Sub CustomRemotableException(ByVal message As String)
      _internalMessage = message
  End Sub
  Public Sub CustomRemotableException(ByVal info As _
      SerializationInfo, ByVal context As StreamingContext)
      _internalMessage = info.GetValue("_internalMessage", _
                                  _internalMessage.GetType())
  End Sub
  Public Overrides Sub GetObjectData(ByVal info As SerializationInfo, _
                                   ByVal context As StreamingContext)
       info.AddValue("_internalMessage", _internalMessage)
  End Sub
  Public Shadows ReadOnly Property Message() As String
    Get
     Return "This is your custom remotable exception returning: \"" " + 
                                              _internalMessage + "\"";"
    End Get
  End Property
End Class
[Serializable]
public class CustomRemotableException : RemotingException, ISerializable {
   private string _internalMessage;

   public CustomRemotableException(){
      _internalMessage = String.Empty;
   }
   
   public CustomRemotableException(string message){
      _internalMessage = message;
   }
   
   public CustomRemotableException(SerializationInfo info, StreamingContext context){
      _internalMessage = (string)info.GetValue("_internalMessage", typeof(string));
   }

   public override void GetObjectData(SerializationInfo info, StreamingContext context){
      info.AddValue("_internalMessage", _internalMessage);
   }

   // Returns the exception information. 
   public override string Message{
      get {
            return "This is your custom remotable exception returning: \"" 
      + _internalMessage 
      + "\"";
      }
   }
}

请参见

参考

ContextBoundObject

概念

可远程处理的和不可远程处理的对象

其他资源

不可远程处理的对象