我正在构建一个MAF管道,外接程序也可以使用它来回调主机系统,以使用主机的一些服务。这些方法可能抛出异常,应由外接程序处理。处理这种情况不仅意味着要抓住它们,还要分析它们。
与往常一样,有两种方法可以跨appdomain边界获取对象:通过序列化它们或通过扩展MarshalbyRefObject
。
实际上我对两个选项都有问题:
当我使用序列化时,我的外接程序需要知道异常的确切类型,否则它不能反序列化异常。这意味着我不能在抽象层上工作。Exception类本身被标记为可序列化的,所以所有子类也需要被标记为可序列化的,这样才能工作。对我来说,这不是一个真正的解决方案,因为我不能隔离主机和外接程序之间的类型(因为我不能在抽象上工作)
使用MarshalbyRefObject不能像所有的Exception需要扩展"Exception"一样工作,因此不能扩展MarshalbyRefObject。
有什么标准模式可以解决这个问题吗?
我过去解决这个问题的方法是在异常中使用Data
对象在层之间传递私有数据。
try
{
}
catch (SomeSpecificException spex)
{
var exception = new Exception();
exception.Data.Add("Something", "Specific");
throw exception;
}
基本上,在我的适配器层中,我有将任何特定异常转换为一般异常的代码。然后,在另一边的适配器层,我可以检查数据对象并将其转换为可由其调用者使用的异常。