IMZRH的日志

努力成为一个有用的人

导航

ICE框架之Slice2CSharp映射---异常的映射

Posted on 2008-05-14 17:51  张荣华  阅读(1146)  评论(0编辑  收藏  举报

 

下图显示了异常的继承关系:


下图显示了异常的继承关系:

图中所有的异常都继承自System.ApplicationException异常类,Ice.Exception是System.ApplicationException的子类,而分别用来表示ice run time异常和用户异常的Ice.LocalException、Ice.UserException类则是Ice.Exception类的子类。

Ice.Exception类的构造函数如下:

public abstract class Exception : System.ApplicationException

  {

        public Exception();

        public Exception(System.Exception ex);

}

每一个继承自Ice.Exception的类都要实现这两个构造函数。第二个构造函数需要一个参数,构造函数用这个参数来初始化继承自ApplicationException类的InnerException属性的值;上面所说的两个构造函数都会将Message属性设为String.Empty。

下面是一些Slice异常的定义:

exception GenericError {                  string reason;             };

exception BadTimeVal extends GenericError {};

exception BadZoneName extends GenericError {};

上面这些定义用Slice2C#生成的代码如下:

public class GenericError : Ice.UserException

{

   public string reason;

   public GenericError();

   public GenericError(System.Exception ex__);

   public GenericError(string reason);

   public GenericError(string reason, System.Exception ex__);

   // GetHashCode and comparison methods defined here,

     // as well as mapping-internal methods.

}

public class BadTimeVal : M.GenericError

{

     public BadTimeVal();

     public BadTimeVal(System.Exception ex__);

     public BadTimeVal(string reason);

     public BadTimeVal(string reason, System.Exception ex__);

            // GetHashCode and comparison methods defined here,

            // as well as mapping-internal methods.

}

public class BadZoneName : M.GenericError

{

       public BadZoneName();

       public BadZoneName(System.Exception ex__);

       public BadZoneName(string reason);

       public BadZoneName(string reason, System.Exception ex__);

       // GetHashCode and comparison methods defined here,

       // as well as mapping-internal methods.

}

每个Slice异常都会映射到一个同名的C#异常类。对于每个异常成员,对应的类都会包含一个 public 数据成员 (显然,因为 BadTimeVal BadZone-Name 没有成员,为这两个异常生成的类也没有成员)。

在生成的类中, Slice异常的继承结构得到了保持,所以BadTimeVal BadZoneName 都是从GenericError继承的。

所有用户异常都派生自基类 Ice.UserException。所以针对Ice.UserException 安装一个处理器,你可以捕捉所有用户异常;同样,针对Ice.LocalExceptionIce.Exception安装处理器,你就可以捕获所有Ice运行时异常或Ice异常。

如果一个异常(或异常的一个基类)包含数据成员,那么用Slice2Cs生成的类便多了两个构造方法,这些新增的构造方法允许你在声明异常类的时候初始化数据成员,以减少代码的行数。

    所有生成的异常类都提供了GetHashCodeEquals ==比较、!=比较的实现。另外,生成的异常类还提供了一些其它的方法,但那些方法是供 Java 映射内部使用的,应用代码不应该调用它们。