Я уверен, что есть "хороший" способ решить эту проблему, но меня это всегда беспокоило. У меня есть метод, который должен возвращать объект, но имеет определенные предварительные условия для его параметров. Они находятся вне моего контроля и могут не работать по причинам "бизнес-логики" (если вы простите устаревший термин).
Возвращаемое значение объекта будет нулевым, но я также хотел бы передать, почему, поэтому вызывающий код может по существу сказать: «Я не получил свой объект обратно, потому что не было достаточно информации для его создания». .
Я не думаю, что попытка поймать - правильный подход, но я использовал его в этой ситуации из-за отсутствия лучшего подхода. Все, что я читаю здесь о 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;
}