2013-11-09 50 views
1

和我通过一些可用的价值观很感兴趣,但我使用的onError功能脚本Application.cfc错误的ColdFusion 10俘获

根据learn.adobe.com,cferror有一个诊断错误变量以及一些其他有趣的位,如error.remoteAddresserror.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."); 
     } 
    } 
} 
+0

确切地说你是如何使用onError? –

+1

(编辑 - 我没有时间写一个答案,但是...)大多数这些值(远程地址,等等)都是简单的请求参数[可以通过多种方式获得,例如通过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

+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>