任何操作调用都可以抛出运行时异常,而且,如果操作有异常规范,还可以抛出用户异常。假定我们有这样一个简单的接口:
exception Tantrum {
string reason;
};
interface Child {
void askToCleanUp() throws Tantrum;
};
Slice 异常是作为C# 异常抛出的,所以你可以把一个或更多操作调用放在 try–catch块中:
ChildPrx child = ...; // Get child proxy...
try {
child.askToCleanUp();
} catch (Tantrum t) {
System.Console.write("The child says: ");
System.Console.writeln(t.reason);
}
在典型情况下,你只需针对操作调用捕捉你感兴趣的一些异常;其他异常,比如意料之外的运行时错误,通常会由更高层次的异常处理器来处理。例如:
public class Client {
static void run() {
ChildPrx child = ...; // Get child proxy...
try {
child.askToCleanUp();
} catch (Tantrum t) {
System.Console.Write("The child says: ");
System.Console.Write(t.reason);
p.scold(); // Recover from error...
}
p.praise(); // Give positive feedback...
}
public static void
main(String[] args)
{
try {
// ...
run();
// ...
} catch (Ice. Exception e) {
System.Console.Write(e);
}
}
}
出于局部的考虑,这段代码会在调用的地方处理一个具体的异常,并且一般化地处理其他异常 .
注意,异常的ToString方法会输出异常的名称、内部异常的信息以及踀痕迹,当然你可以选择显示异常的那些信息,比如你可以用e.GetType().Name只输出异常的名字。
异常与out 参数
当操作抛出异常时,Ice run time 不保证out 参数的状态:参数的值可能没有变,也可能已经被目标对象中的操作实现改变了。换句话说,对于输出参数,Ice 提供的是弱异常保证(这是出于性能的原因) ,没有提供强异常保证。