我们有一个让用户上传文件的系统,我们遍历该文件,然后制作另一个文件。上传文件的用户是登录用户。
问题是文件包含敏感数据,因此我们必须删除它们。您可以想象有一些地方可以将更多信息写入文件并读取文件。有时在此页面上发生错误(通常与CFFILE有关)。
所以我的问题是,将所有代码(大多数代码)放在一个巨大的CFTRY中是否可以?然后捕获发生的任何异常,然后在CFCATCH中运行另一个CFTRY以删除2个文件?(阅读更新)我不太担心性能,因为这个过程没有做一百万次一天,也许一个月3次。
这是否可以确保文件被删除?
更新我不会删除CFCATCH中的文件。我先来看看是否存在。然后删除它们。
答案 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,你可以将整个变量写入文件。