我正在从文件中读取数据并根据这些数据创建对象。数据格式不在我的控制之下,偶尔会损坏。在 C# 中构造对象时,处理这些错误的最合适方法是什么?
在其他编程语言中,我返回了一个 null,但这似乎不是 C# 的一个选项。
我已经设法找出以下选项,但我非常感谢更有经验的 C# 程序员的建议:
方案1.在构造函数中读取文件,当源数据损坏时抛出异常:
try
{
obj = Constructor(sourceFile);
... process object ...
}
catch (IOException ex)
{
...
}
选项 2. 创建对象,然后使用方法从源文件中读取数据:
obj = Constructor();
obj.ReadData(sourceFile);
if (obj.IsValid)
{
... process object ...
}
或者可能在出错时抛出异常:
obj = Constructor();
try
{
obj.Read(sourceFile);
... process object ...
}
catch
{
...
}
选项 3. 使用静态 TryParse 方法创建对象:
if (ObjClass.TryParse(sourceFile, out obj))
{
... process object ...
}
如果是这样,我应该使用选项 1 在内部实现选项 3 吗?
public static bool TryParse(FileStream sourceFile, out ObjClass obj)
{
try
{
obj = Constructor(sourceFile);
return true;
}
catch (IOException ex)
return false;
}
最佳答案
我会按照选项 3 的思路做一些事情):
class ObjectClass
{
protected ObjectClass(...constructor parameters your object depends on...)
{
}
public static ObjectClass CreateFromFile(FileStream sourceFile)
{
.. parse source file
if (parseOk)
{
return new ObjectClass(my, constructor, parameters);
}
return null;
}
}
然后像这样使用它:
ObjClass.CreateFromFile(sourcefile);
一般来说,构造函数应该将本质上定义类的所有属性作为参数。进行重量级计算(如解析文件)最好留给工厂方法,因为通常不希望构造函数执行复杂且可能长时间运行的任务。
更新:如评论中所述,更好的模式是这样的:
public static ObjectClass CreateFromFile(FileStream sourceFile)
{
.. parse source file
if (!parseOk)
{
throw new ParseException(parseErrorDescription);
}
return new ObjectClass(my, constructor, parameters);
}
public static bool TryCreateFromFile(FileStream sourceFile, out ObjectClass obj)
{
obj = null;
.. parse source file
if (!parseOk)
{
return false;
}
obj = new ObjectClass(my, constructor, parameters);
return true;
}
关于c# - 在 C# 构造函数中处理损坏的输入数据的最合适方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6223826/