将 CFTRY 标签包裹在所有内容周围



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

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

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

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

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

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

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

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

关于一个巨大的 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>

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

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

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

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

我不得不编写一段新的代码,几乎与我要求的内容相同。而不是将单独的行写入文件,然后在它周围包装一个大的 CFTRY。相反,我将每一行写入一个变量,并用换行符结束每一行,在我的例子中(Windows)新行字符Chr(13) & Chr(10)。但你应该使用以下代码行

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

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

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

最新更新