如何处理泛型返回T的异常

时间:2012-10-25 05:14:51

标签: c# .net generics exception-handling default

如果在函数体中出现异常,如何返回一个新的空类型?

如果在反序列化xml时遇到问题,x到新T()的最佳方法是什么?

查看我是如何获得catch块的,以及如何处理它?<​​/ p>

        public static T DeserializeXml<T>(this string xml) where T : class
    {

        XmlDocument doc = new XmlDocument();
        MemoryStream ms = new MemoryStream();
        StreamReader sr = null;
        T x = null;
        //
        try
        {
            doc.LoadXml(xml); doc.Save(ms);
            ms.Position = 0;
            sr = new StreamReader(ms);
            XmlSerializer i = new XmlSerializer(typeof(T));
            x = (T)i.Deserialize(sr);
        }
        catch (Exception) {
            x = null;
        }
        finally {
        sr.Close(); sr.Dispose(); ms.Close(); ms.Dispose();
        }
        //
        return x as T;
    }

4 个答案:

答案 0 :(得分:3)

您可以使用default

return default(T);

答案 1 :(得分:3)

您可以约束T拥有空构造函数。这就是你问的问题吗?

public static T DeserializeXml<T>(this string xml) where T : class, new()
{
    //...
    catch
    {
        x = new T();
    }
    //...
    return x as T;       
}

答案 2 :(得分:2)

您真正需要做的就是

catch (Exception) {
    x = default(T);
}

或类似的东西。实际上,您可以在return子句中null catch;除非拔出电源插头,否则finally子句仍可保证运行,where T: class约束确保默认值(T)始终为空。

考虑使用一些using块,而不是那些关闭和处置。那么你根本不需要finally块。

public static T DeserializeXml<T>(this string xml) where T : class
{

    XmlDocument doc = new XmlDocument();
    using (MemoryStream ms = new MemoryStream())
    {
        using (StreamReader sr = new XmlSerializer(typeof(T))
        {
            T x = null;

            try
            {
                doc.LoadXml(xml); doc.Save(ms);
                ms.Position = 0;
                sr = new StreamReader(ms);
                XmlSerializer i = new XmlSerializer(typeof(T));
                x = (T)i.Deserialize(sr);
            }
            catch (Exception) {
                return null;
            }
        }
    }
    return x;
}

答案 3 :(得分:2)

您可以返回default(T),也可以向通用类型where T : new()添加约束,在这种情况下,您可以返回new T()

基本上,default(T)适用于您不知道T是值还是引用类型的情况。它为不同的类型返回不同的东西 - 类为null,数字类型为零,结构为空。有一篇好文章on MSDN