假设我有以下代码:
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
是否会为我做这个?
答案 0 :(得分:3)
不应使用例外来控制程序的正常流程。它们发生时会大大减慢执行速度。您的程序希望从无效的XML文件中排序有效的XML文件。因此,您期望出现无效的XML文件,这就是您将它们分类到不同文件中的原因。因此,您应该返回一个布尔值而不是抛出异常。
答案 1 :(得分:2)
您可能想要考虑的一个问题是单一责任原则:方法应该做好一件事。
您的验证方法至少做了三件事:
如果你打破这些,也许你会有更轻松的时间。
如果有人想在不移动文件的情况下验证XML,该怎么办?在这种情况下,无法调用您的方法。
即使验证也值得怀疑。如果您检查架构,则会在第一个问题上抛出异常。用户想要立刻知道所有问题吗?如果是的话,你将不得不走树,自己找出所有的错误。
答案 2 :(得分:1)
如果它返回boolean
,它看起来会更清晰,更简单:
if(validate(xml_file)) move(xml_file, valid_folder);
else move(xml_file, error_folder);
但是,您的解决方案(抛出异常)可能会包含大量有关可以传递给move()
方法的抛出异常的信息。或者,validate()
方法返回int
,其中每个值指示特定状态。
答案 3 :(得分:1)
你可以把它作为布尔值。您可以在validate方法的开头添加布尔变量(最初为true),在内部catch中可以将其设置为false。在函数的末尾,返回布尔变量值。因此,如果try块中的代码遇到异常,则通过将boolean变量设置为false来处理它,以便在遇到异常时返回false,否则返回true。