1
和我通过一些可用的价值观很感兴趣,但我使用的onError
功能脚本Application.cfc
。错误的ColdFusion 10俘获
根据learn.adobe.com,cferror有一个诊断错误变量以及一些其他有趣的位,如error.remoteAddress
和error.generatedContent
。
问:如果我在scripted Application.cfc中使用onError,那么如何获得诊断错误变量(以及其他错误)?
编辑:你确切地使用onError
?
public void function onSessionStart() {
session.TryCatch = 3;
}
public boolean function onRequestStart(String targetPage){
request.TickCount = GetTickCount();
request.LogDBSort = 0;
return true;
}
public void function onError(Exception,EventName) {
if (StructKeyExists(session,"TryCatch") && session.TryCatch) {
session.TryCatch -= 1;
if (StructKeyExists(Exception,"Message")) {
WriteOutput("It looks like you got the following ColdFusion error:<blockquote>"
& Exception.Message
& "</blockquote>"
);
local.LogCFErrMessage = Exception.Message;
} else {
local.LogCFErrMessage = "No Exception.Message";
}
param request.TickCount = GetTickCount();
param request.LogDBSort = -999;
request.LogDBSort += 1;
if (StructKeyExists(Exception,"Name")) {
local.LogCFErrName = Exception.Name;
} else {
local.LogCFErrName = "No Exception.Name";
}
if (StructKeyExists(Exception,"Detail")) {
local.LogCFErrDetail = Exception.Detail;
} else {
local.LogCFErrDetail = "No Exception.Detail";
}
if (StructKeyExists(Exception,"Number")) {
local.LogCFErrNumber = Exception.Number;
} else {
local.LogCFErrNumber = "No Exception.Number";
}
if (StructKeyExists(Exception,"Type")) {
local.LogCFErrType = Exception.Type;
} else {
local.LogCFErrType = "No Exception.Type";
}
if (StructKeyExists(Exception,"EventName")) {
local.LogCFErrEventName = Exception.EventName;
} else {
local.LogCFErrEventName = "No Exception.EventName";
}
local.svc = new query();
local.sql = "
DECLARE @LogCFErrSort Int = #Val(request.LogDBSort)#;
DECLARE @LogCFErrNumber Int = #Val(local.LogCFErrNumber)#;
DECLARE @LogCFErrElapsed Int = #GetTickCount() - request.TickCount#;
INSERT INTO LogCFErr
(LogCFErrSort, LogCFErrNumber, LogCFErrElapsed,LogCFErrName,LogCFErrDetail,LogCFErrMessage,LogCFErrType,LogCFErrEventName) VALUES(
@LogCFErrSort,@LogCFErrNumber,@LogCFErrElapsed,?,?,?,?,?)
";
local.svc.setSQL(local.sql);
local.svc.addParam(cfsqltype="CF_SQL_VARCHAR",value=Left(local.LogCFErrName,512));
local.svc.addParam(cfsqltype="CF_SQL_VARCHAR",value=Left(local.LogCFErrDetail,512));
local.svc.addParam(cfsqltype="CF_SQL_VARCHAR",value=Left(local.LogCFErrMessage,512));
local.svc.addParam(cfsqltype="CF_SQL_VARCHAR",value=Left(local.LogCFErrType,512));
local.svc.addParam(cfsqltype="CF_SQL_VARCHAR",value=Left(local.LogCFErrEventName,512));
local.svc.execute();
if (IsDefined("Application.Home.Email.UserName")) {
local.svc = new mail();
local.svc.setSubject(GetApplicationMetaData().Name & ': ' & ListLast(GetBaseTemplatePath(),'\'));
local.msg = LogCFErrMessage;
local.svc.setBody(local.msg);
local.svc.setServer(Application.Home.Email.Server);
local.svc.setType(Application.Home.Email.Type);
local.svc.setUseSSL(Application.Home.Email.UseSSL);
local.svc.setPort(Application.Home.Email.Port);
local.svc.setFrom(Application.Home.Email.UserName);
local.svc.setUserName(Application.Home.Email.UserName);
local.svc.setPassword(Application.Home.Email.Password);
local.svc.setTo(Application.Home.Email.UserName);
local.svc.Send();
WriteOutput("I've sent an email to the administrator to let them know.");
}
}
}
确切地说你是如何使用onError? –
(编辑 - 我没有时间写一个答案,但是...)大多数这些值(远程地址,等等)都是简单的请求参数[可以通过多种方式获得,例如通过GetHTTPRequestData(),CGI作用域,等等](http://www.stephenwithington.com/blog/index.cfm/2008/8/26/CGI-Variables-and-Their-Respective-ColdFusionJava-Servlet-Alternative-Methods)。我相信“消息”类似于“诊断”,只是减去行号,可以从Error.TagContent.Line中获得。 – Leigh
@Leigh,这是一个非常有用的链接!谢谢! –