2013-11-09 3 views
1

Я следую в 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."); 
     } 
    } 
} 
+0

Как именно вы используете onError? –

+1

(Изменить - у меня нет времени, чтобы написать ответ, но ...) Большинство из этих значений (удаленный адрес и т. Д.) - это простые параметры запроса, которые [могут быть получены несколькими способами, например, через 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

+0

@Leigh, это действительно полезная ссылка! Благодаря! –

ответ

1

Я использую arguments.exception. Вот пример.

<cffunction name="onError"> 
<cfargument name="Exception" required=true type="any"> 
more code 

<cfmail to="#recipients#" 
from="#recipients#" 
subject="Error on whatever" type="html"> 

<p>Error Occurred #now()#</p> 
<cfdump var="#Arguments.Exception#" label="exception"> 
<cfdump var="#request#" label="request"> 
<cfdump var="#cgi#" label="cgi"> 
</cfmail> 
Смежные вопросы