Coldfusion 8响应特定错误

Coldfusion 8响应特定错误,coldfusion,error-handling,Coldfusion,Error Handling,我正在编写一个API,它向客户机公开我们数据库的一部分。此API的一部分要求针对特定条件发送某些HTML响应代码。通过简单的检查,这通常很容易,但我看不到如何捕获(例如)向SQL提交无效日期的“InvalidDateTimeException”错误 我曾尝试转储错误和cfcatch变量,但尽管它们生成了巨大的堆栈跟踪,但我看不到任何易于分析的字段来检查特定类型的错误(除了对错误消息或堆栈跟踪进行文本搜索) 我还可以使用正则表达式进行预检查,例如 (\d{4})-(\d{2})-(\d{2})(\

我正在编写一个API,它向客户机公开我们数据库的一部分。此API的一部分要求针对特定条件发送某些HTML响应代码。通过简单的检查,这通常很容易,但我看不到如何捕获(例如)向SQL提交无效日期的“InvalidDateTimeException”错误

我曾尝试转储错误和cfcatch变量,但尽管它们生成了巨大的堆栈跟踪,但我看不到任何易于分析的字段来检查特定类型的错误(除了对错误消息或堆栈跟踪进行文本搜索)

我还可以使用正则表达式进行预检查,例如

(\d{4})-(\d{2})-(\d{2})(\d{2}):(\d{2}):(\d{2})

但这仍然会生成无效日期。Coldfusion还提供了一些日期验证,但我已经读到了。这也无助于其他不涉及日期的场景

那么简单地说:对于coldfusion中的“InvalidDateTimeException”这样的特定错误,最好的反应方式是什么

[编辑]
评论中的一些澄清——我们使用的是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
使用上述任何一种(或全部)方法,您应该将coldfusion代码包装在try/catch构造中,并且有一个更容易处理的错误

根据您的DBMS,您可能也可以访问那里的Try/catch结构

****更新:

在阅读了您关于国际转换问题的评论后,我有两种方法可供选择:

请记住,我没有测试过任何代码或任何东西

首先,也许国际功能可以帮助你

使用Setlocale将位置设置为英语(澳大利亚),然后使用LSParseDateTime以yyyy-mm-dd格式读取,然后使用dateformat以mm/dd/yyyy或其期望的任何日期格式将其写入mySQL。不过,我没有太多处理LS函数的经验

第二个选项,使用您提供的正则表达式确保输入具有正确的结构,然后使用createDate使用解析的mm dd和yyyy元素以US格式创建日期。使用isValid验证usdate

下面是对第二个选项的盲编码尝试。记住,我还没有测试过这段代码。我大量使用list函数listGetAt将输入的日期时间拆分为单独的日期和时间字符串,然后使用listGetAt解析出各个日期部分

<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错误与常规数据库错误分开,即我想问的是什么。很高兴能帮上忙。希望你一切顺利。