c# - 在 C# 构造函数中处理损坏的输入数据的最合适方法是什么?

标签 c# parsing exception constructor

我正在从文件中读取数据并根据这些数据创建对象。数据格式不在我的控制之下,偶尔会损坏。在 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/

相关文章:

parsing - 如何从Aeson的Haskell中的Value中获取HashMap(Object)?

java - FileNotFoundException 但文件存在于正确的路径中

c# - 面向业务逻辑的 OO 设计

c# - 如何根据不同情况初始化动态列表类型?

c# - 存储对实例方法的静态引用?

sql - 将逻辑运算符与其他中缀运算符区分开来

python - 获取python代码的解析树

c# - 单元测试,模拟 - 简单案例 : Service - Repository

c# - 捕获特定的 WebException (550)

javascript - 如何将 Browserify 包中的堆栈跟踪转换为原始源代码位置?