Я следую в Ray's The Complete Guide to Adding Error Handling to Your ColdFusion Application и заинтригован некоторыми значениями, которые доступны, но я использую функцию onError
в сценарии Application.cfc
.Ошибка захвата в ColdFusion 10
Согласно learn.adobe.com, cferror имеет переменную ошибки диагностики вместе с некоторыми другими интересными битами, такими как error.remoteAddress
и error.generatedContent
.
В: Если я использую onError в scripted Application.cfc, то как мне получить переменную ошибки диагностики (вместе с остальными)?
Редактировать: точно как вы используете 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 , etcetera] (http://www.stephenwithington.com/blog/index.cfm/2008/8/26/CGI-Variables-and-Their-Respective-ColdFusionJava-Servlet-Alternative-Methods). Я считаю, что «сообщение» похоже на «диагностику», просто минус номер строки, который можно получить из «Error.TagContent.Line». – Leigh
@Leigh, это действительно полезная ссылка! Благодаря! –