围绕一切包裹CFTRY标签

时间:2013-01-25 07:17:09

标签: coldfusion error-handling coldfusion-8

我们有一个让用户上传文件的系统,我们遍历该文件,然后制作另一个文件。上传文件的用户是登录用户。

问题是文件包含敏感数据,因此我们必须删除它们。您可以想象有一些地方可以将更多信息写入文件并读取文件。有时在此页面上发生错误(通常与CFFILE有关)。

所以我的问题是,将所有代码(大多数代码)放在一个巨大的CFTRY中是否可以?然后捕获发生的任何异常,然后在CFCATCH中运行另一个CFTRY以删除2个文件?(阅读更新)我不太担心性能,因为这个过程没有做一百万次一天,也许一个月3次。

这是否可以确保文件被删除?

更新我不会删除CFCATCH中的文件。我先来看看是否存在。然后删除它们。

4 个答案:

答案 0 :(得分:3)

只要有必要,可以使用try / catch。如果你把try / catch放在101行代码而不是允许的100行代码中,那么没有CFML警察会在半夜把你拖走。

然而 - 正如@Tomalak所说 - 你的措辞有点暗示代码可以进行一些重构。你说你不能重构代码,但添加异常处理已经在重构,所以很明显你可以这样做。所以做得恰当。隔离一些功能,并将它们放入单独的模块中(我的意思并不像<cfmodule>所说的那样,我的意思是通用术语),无论是UDF,还是一个或多个CFC中的方法(它们可能是完全不同的) ,所以可能不适合单个CFC),甚至只包含文件。它们可以稍后重构更好。开发是迭代和循环的,请记住:每次进行更改时,您都不需要它完美。一方面,“完美”的定义随着需求的变化而变化。但是,您应该在维护代码时始终改进代码。而且我不认为简单地对整个事情进行一次尝试/捕获就意味着改进,更像是“这段代码失控”。

我可以建议的另一件事是进行改进,或者将其发布到https://codereview.stackexchange.com/,并找出其他人的想法。我不知道有多少CFers居住在那个网站上,所以当你这样做的时候在Twitter上发布标有#ColdFusion的内容可能会很好。

答案 1 :(得分:3)

我唯一想说的是一个巨大的try / catch块,它会停止try块中的所有处理,所以如果你还有可以完成的东西,只需要因为轨道上有四分之一就停止整列火车可能有点矫枉过正。

我有一个与大量文件一起使用的类似过程,我们将每个进程放在一个单独的try / catch块中,这样它们就不会相互干扰。即一个破碎的第一个文件并没有搞砸接下来的3个完美的文件。 catch块只是将错误消息添加到字符串,然后通知用户文件中的错误格式(或其他)是坏的但是按预期处理好的文件。

<!--- file one --->
<cftry>
  some stuff
  <cfcatch>
    <cfset errors = errors & "file one did not work because #cfcatch.message#">
  </cfcatch>
</cftry>

<!--- file 2 --->
<cftry>
  some stuff
  <cfcatch>
    <cfset errors = errors & "file two did not work because #cfcatch.message#">
  </cfcatch>
</cftry> 
<cfetc...>

如果你在动态集上循环,你可以把try / catch块放在循环中,这样try / catch就不会停止循环而其他东西可以处理。当然,如果文件2依赖于文件1 ......

,这不起作用
<cfloop index = "i" ...>
  <cftry>
    some stuff
    <cfcatch>
      <cfset errors = errors & "file #i# did not work because #cfcatch.message#">
    </cfcatch>
  </cftry>
</cfloop>

答案 2 :(得分:1)

我们对文件有类似的情况并采取不同的方法。

第1步是限制对包含文件的目录的访问。

步骤2计划清理。我们每天都有一个ColdFusion工作。它会检查各种目录并删除超过x天的任何文件。 x的值取决于目录。

这种方法可能适合您的情况,也可能不适合您。

答案 3 :(得分:0)

我不得不写一段新的代码,几乎与我的问题完全相同。而不是将单独的行写入文件,然后围绕它包装一个大的CFTRY。我改为将每一行写成一个变量,并用一个换行符结束每一行,在我的情况下(Windows),换行符Chr(13) & Chr(10)。但您应该使用以下代码行

<cfset NL = CreateObject("java", "java.lang.System").getProperty("line.separator")>

这将使变量NL等于当前系统换行符。

然后你可以有一个小的CFTRY,你可以将整个变量写入文件。