如何确保异常类型安全?

时间:2013-01-18 16:47:24

标签: c# wcf exception sqlexception servicemodelex

我正在使用一些改编自Lowy的ServiceModelEx的代码来在FaultException内打包一个异常,通过网络发送它,然后将它作为.NET Exception在客户端上解压缩。我的服务器可以在理论上抛出任何类型的异常,但我们以SqlException为例。

Lowy使用反射来解包,因此代码需要检查异常的类型以确定它是否可以构造有效的对象:

    static Exception ExtractException(ExceptionDetail detail)
    {
        Exception innerException = null;
        if (detail.InnerException != null)
        {
            innerException = ExtractException(detail.InnerException);
        }
        Type type = Type.GetType(detail.Type);
        Debug.Assert(type != null, "Make sure this assembly contains the definition of the custom exception");
        Debug.Assert(type.IsSubclassOf(typeof(Exception)));

        //...
    }

两个问题

  1. 使用SqlExceptions,第一个Debug.Assert失败。试图让他们在客户端上解决,我已经设置了System.Data的引用,但没有运气。我假设这是因为,在该客户端中没有任何实际的System.Data调用,编译器会删除引用?在短期内,我可以做些什么让我的客户解决.GetType来电?

  2. 在不丢失细节粒度(例如LambdaException)的情况下“重新抛出”ExceptionDetail作为基础StackTrace的正确方法是什么,并且不需要任何汇编引用客户端?这甚至可能吗?

  3. 编辑:这是将ExceptionDetail包装为服务器上的FaultException的来源。同样,这主要来自Lowy的ServiceModelEx:

        public static void PromoteException(Type serviceType, Exception error, MessageVersion version, ref Message fault)
        {
            //Is error in the form of FaultException<T> ? 
            if (error.GetType().IsGenericType && error is FaultException)
            {
                Debug.Assert(error.GetType().GetGenericTypeDefinition() == typeof(FaultException<>));
                return;
            }
    
            ExceptionDetail exdetail = new ExceptionDetail(error);
            FaultException<ExceptionDetail> faultException = new FaultException<ExceptionDetail>(exdetail);
    
            MessageFault messageFault = faultException.CreateMessageFault();
            fault = Message.CreateMessage(version, messageFault, faultException.Action);
    
            //...
        }
    

0 个答案:

没有答案