Coldfusion 8响应特定错误
我正在编写一个API,它向客户机公开我们数据库的一部分。此API的一部分要求针对特定条件发送某些HTML响应代码。通过简单的检查,这通常很容易,但我看不到如何捕获(例如)向SQL提交无效日期的“InvalidDateTimeException”错误 我曾尝试转储错误和cfcatch变量,但尽管它们生成了巨大的堆栈跟踪,但我看不到任何易于分析的字段来检查特定类型的错误(除了对错误消息或堆栈跟踪进行文本搜索) 我还可以使用正则表达式进行预检查,例如 (\d{4})-(\d{2})-(\d{2})(\d{2}):(\d{2}):(\d{2}) 但这仍然会生成无效日期。Coldfusion还提供了一些日期验证,但我已经读到了。这也无助于其他不涉及日期的场景 那么简单地说:对于coldfusion中的“InvalidDateTimeException”这样的特定错误,最好的反应方式是什么 [编辑]Coldfusion 8响应特定错误,coldfusion,error-handling,Coldfusion,Error Handling,我正在编写一个API,它向客户机公开我们数据库的一部分。此API的一部分要求针对特定条件发送某些HTML响应代码。通过简单的检查,这通常很容易,但我看不到如何捕获(例如)向SQL提交无效日期的“InvalidDateTimeException”错误 我曾尝试转储错误和cfcatch变量,但尽管它们生成了巨大的堆栈跟踪,但我看不到任何易于分析的字段来检查特定类型的错误(除了对错误消息或堆栈跟踪进行文本搜索) 我还可以使用正则表达式进行预检查,例如 (\d{4})-(\d{2})-(\d{2})(\
评论中的一些澄清——我们使用的是MYSQL 5和cfqueryparams。在澳大利亚,我们使用“欧元”日期格式,但如果api用户提供ISO格式的日期(yyyy-mm-dd)以避免混淆,则更可取。好吧。。。。我的建议是在错误进入SQL之前捕获它。您没有指定DBMS(SQL Server、MySQL等),因此我将重点介绍ColdFusion解决方案。我希望这些建议中的一个能为你指明正确的方向 选项:
- 您链接到的关于Coldfusion日期验证的文章提到isValid函数是推荐的解决方案。考虑使用UsDebug验证类型,如建议的那样。
- 如果您在API方法中使用CFC或至少使用cffunctions,那么您可以使用cfargument type=“date”来帮助确保日期有效(尽管我觉得这与isDate具有相同的宽松行为)
- 在cfquery标记内部,您应该对所有传递的参数使用cfqueryparam,尤其是直接从用户传递的参数(无论是表单post还是API调用)。您应该使用cfqueryparam cfsqltype=CF\u SQL\u DATE
<cfscript>
isosampledate = "2013-06-05 14:07:33";
passesValidation = false;
expectedDatePattern = "\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}";
try {
if (refind(expectedDatePattern,isosampledate)) {
datePortion = listGetAt(isosampledate,1," ");
timePortion = listGetAt(isosampledate,2," ");
yearPart = listGetAt(datePortion,1,"-");
monthPart = listGetAt(datePortion,2,"-");
dayPart = listGetAt(datePortion,3,"-");
hoursPart = listGetAt(timePortion,1,":");
minutesPart = listGetAt(timePortion,2,":");
secondsPart = listGetAt(timePortion,3,":");
thisUSDate = createDateTime(yearPart,monthPart,dayPart,hoursPart,minutesPart,secondsPart)
if (isValid("usdate",thisUSDate) {
passesValidation = true;
sqlDate = CreateODBCDateTime(thisUSDate);
}
}
} catch (e:any) {
passesValidation = false;
}
</cfscript>
isosampledate=“2013-06-05 14:07:33”;
passesValidation=false;
expectedDatePattern=“\d{4})-(\d{2})-(\d{2})(\d{2}):(\d{2}):(\d{2});
试一试{
if(重新查找(预期日期模式、等采样日期)){
DateParty=listGetAt(isosampledate,1,“”);
时间部分=listGetAt(isosampledate,2,“”);
yearPart=listGetAt(日期部分,1,“-”;
monthPart=listGetAt(日期部分,2,“-”;
dayPart=listGetAt(日期部分,3,“-”;
hoursPart=listGetAt(时间部分,1,“:”);
minutesPart=listGetAt(时间部分,2,“:”);
secondsPart=listGetAt(时间部分,3,“:”);
thisUSDate=createDateTime(年部分、月部分、日部分、小时部分、分钟部分、秒部分)
如果(有效(“usdate”,本usdate){
passesValidation=true;
sqlDate=CreateODBCDateTime(thisUSDate);
}
}
}捕获(e:任何){
passesValidation=false;
}
我很确定,如果输入的值不是有效的日期,那么这些日期函数中至少有一个会抛出异常,该异常会被catch块拾取
希望这有帮助。我要去睡觉了。一盎司的预防抵得上一磅的治疗。虽然ColdFusion的日期验证并不完美,但它比InvalidDateTimeExceptions要好。如果你想控制用户发送给你的内容,cfinput有一个掩码属性。请注意,如果你预先填充表单字段,掩码属性会使编辑变得更容易他的价值观有点棘手。谢谢。我确实忘了提到我们使用的是MYSQL 5数据库,我一直在使用cfqueryparams-它们是产生错误的原因。我们也有使用澳大利亚(对coldfusion来说,这是euro)格式的问题,但我还是希望用户以ISO格式发送数据(yyyy-mm-dd).我认为isValid不支持这一点(如果我错了,请纠正我).-enter而不是shift enterYep,这很有帮助。在我的实现中,我可能会执行此检查,然后只使用SQLDate对象将日期加载到数据库中。我没有想到将ODBCDateTime对象保存在变量中,这样才最有帮助。这将InvalidDate错误与常规数据库错误分开,即我想问的是什么。很高兴能帮上忙。希望你一切顺利。