下图显示了异常的继承关系:
下图显示了异常的继承关系:
图中所有的异常都继承自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.LocalException或Ice.Exception安装处理器,你就可以捕获所有Ice运行时异常或Ice异常。
如果一个异常(或异常的一个基类)包含数据成员,那么用Slice2Cs生成的类便多了两个构造方法,这些新增的构造方法允许你在声明异常类的时候初始化数据成员,以减少代码的行数。
所有生成的异常类都提供了GetHashCode、Equals、 ==比较、!=比较的实现。另外,生成的异常类还提供了一些其它的方法,但那些方法是供 Java 映射内部使用的,应用代码不应该调用它们。