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