Метод класса C #. Как проиграть и вернуться, почему?

Я уверен, что есть "хороший" способ решить эту проблему, но меня это всегда беспокоило. У меня есть метод, который должен возвращать объект, но имеет определенные предварительные условия для его параметров. Они находятся вне моего контроля и могут не работать по причинам "бизнес-логики" (если вы простите устаревший термин).

Возвращаемое значение объекта будет нулевым, но я также хотел бы передать, почему, поэтому вызывающий код может по существу сказать: «Я не получил свой объект обратно, потому что не было достаточно информации для его создания». .

Я не думаю, что попытка поймать - правильный подход, но я использовал его в этой ситуации из-за отсутствия лучшего подхода. Все, что я читаю здесь о stackoverflow, учебниках и MSDN, похоже, сосредоточено либо на , когда , либо на , как использовать исключения, но я почему-то не могу придумать подход для этого случая.

Может ли кто-нибудь предложить образец, который был бы более подходящим? (первый пост, так что ... пожалуйста, простите за любую оплошность)

Вот образец, с которым я играл в качестве примера: (обратите внимание на строку throw new Exception под комментарием // TODO)

public static Packet Parse(string packetString)
{
    Packet returnPacket = new Packet();
    StringBuilder output = new StringBuilder();

    try
    {
        using (XmlReader reader = XmlReader.Create(new StringReader(packetString)))
        {
            XmlWriterSettings ws = new XmlWriterSettings();
            ws.Indent = true;
            using (XmlWriter writer = XmlWriter.Create(output, ws))
            {
                string rootNodeString = string.Empty;

                // Parse the packet string and capture each of the nodes.
                while (reader.Read())
                {
                    //test root node is the correct opening node name
                    if (rootNodeString == string.Empty)
                    {
                        if (reader.NodeType != XmlNodeType.Element || reader.Name != PACKETROOT)
                        {
                            // TODO: I don't really think this should be an exception, but going with it for now for expediency, since XmlReader is doing the same anyway
                            throw new Exception(string.Format("The root node of a Packet must be <{0}>", PACKETROOT));
                        }
                        else
                        {
                            rootNodeString = reader.Name;
                        }
                    }

                    switch (reader.NodeType)
                    {
                        case XmlNodeType.Element:
                            Console.WriteLine(string.Format("start element = {0}", reader.Name));
                            break;
                        case XmlNodeType.Text:
                            Console.WriteLine(string.Format("text = {0}", reader.Value));
                            break;
                        case XmlNodeType.XmlDeclaration:
                        case XmlNodeType.ProcessingInstruction:
                            Console.WriteLine(string.Format("XmlDeclaration/ProcessingInstruction = {0},{1}", reader.Name, reader.Value));
                            break;
                        case XmlNodeType.Comment:
                            Console.WriteLine(string.Format("comment = {0}", reader.Value));
                            break;
                        case XmlNodeType.EndElement:
                            Console.WriteLine(string.Format("end element = {0}", reader.Name));
                            break;
                    }
                }

            }
        }

    }
    catch (XmlException xem)
    {
        Console.WriteLine(xem.Message);
        throw;
    }

    return returnPacket;
}
5
задан reuben 25 January 2012 в 16:59
поделиться