1

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

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

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

这是确保文件被删除的可接受做法吗?

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

4

4 回答 4

3

只要有保证,就可以使用 try/catch。如果您将 try/catch 放在 101 行代码左右而不是允许的 100 行代码,那么没有 CFML 警察会在半夜将您拖走。

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

我可以建议的另一件事是进行改进并将其发布到https://codereview.stackexchange.com/并了解其他人的想法。我不知道该网站上有多少 CFers,所以当你这样做后,在 Twitter 上发布一些标有#ColdFusion 的东西可能会很好。

于 2013-01-25T08:18:25.280 回答
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>
于 2013-01-25T15:36:57.453 回答
1

我们在文件方面也有类似的情况,并采取了不同的方法。

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

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

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

于 2013-01-25T13:33:07.127 回答
0

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

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

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

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

于 2013-02-01T07:26:10.063 回答