0

假设我有以下代码:

void validate(File f) //or boolean?????
{
  ...
  try
  {
    //try to validate xml file
  }
  catch (Exception e)
  {
  }
}

...

try
{

  validate(xml_file); //validates XML file
  move(xml_file, valid_folder); //moves valid XML file to valid_folder
}
catch (Exception e)
{
  move(xml_file, error_folder); //moves invalid XML file to error_folder
}

...

我的validate()功能应该是boolean,我应该检查文件是否是有效的 XML 文件,还是catching会为我做?

4

4 回答 4

3

不应使用异常来控制程序的正常流程。当它们发生时,它们会大大减慢执行速度。您的程序想要从无效的 XML 文件中对有效的 XML 文件进行排序。因此,您预计会出现无效的 XML 文件,这就是您将它们分类到不同文件的原因。因此,您应该返回布尔值而不是抛出异常。

于 2012-12-16T14:29:30.823 回答
2

您可能要考虑的一个问题是单一职责原则:一种方法应该做好一件事。

您的 validate 方法至少做了三件事:

  1. 从文件中读取 XML
  2. 以某种未指定的方式验证 XML
  3. 将文件移动到一个或另一个文件夹,具体取决于结果

如果你把它们分开,也许你会过得更轻松。

如果有人想在不移动文件的情况下验证 XML 怎么办?在这种情况下无法调用您的方法。

甚至验证也是有问题的。如果您检查架构,您将在第一个问题上抛出异常。用户想立即了解所有问题吗?如果是,您将不得不自己遍历树并找到所有错误。

于 2012-12-16T14:29:15.443 回答
1

如果它返回boolean,它看起来会更简洁:

if(validate(xml_file)) move(xml_file, valid_folder);
else move(xml_file, error_folder);

但是,您的解决方案(抛出异常)可能会携带大量有关您可以传递给move()方法的抛出异常的信息。或者,validate()方法返回int,其中每个值指示特定状态。

于 2012-12-16T14:29:22.967 回答
1

你可以把它当作布尔值。您可以在 validate 方法的开头添加布尔变量(最初为 true),在 catch 中您可以将其设置为 false。在函数结束时,返回布尔变量值。因此,如果 try 块中的代码遇到异常,您可以通过将布尔变量设置为 false 来处理它,以便您的方法在遇到异常时返回 false,否则返回 true。

于 2012-12-16T16:28:21.223 回答