允许主题级别 'EventHandler.cfc' 在 MURA CMS 6 中引发异常?
Allow theme level 'EventHandler.cfc' to raise exceptions in MURA CMS 6?
谁能告诉我,如何在 MURA CMS 6 的主题级别 EventHandler.cfc
中启用异常处理?
我已经不得不删除 Application.cfc
错误方法中的错误处理,因为默认例程没有显示足够的错误详细信息。但是,似乎整个 CFC 框架都包裹在一个 <CFTRY>
块中,坦率地说,这很奇怪。
我更喜欢不涉及使用 <CFCATCH>
将错误转储到文件的解决方案,这是我目前正在使用的临时解决方案。
我只希望 Adobe ColdFusion 的行为方式与我的非 MURA 网站相同。当 CFC 中出现错误时,它会简单明了地显示出来。
当然,对于生产,我的做法是不同的。
更新:
特此通知您,我使用的是 Adobe ColdFusion 11,启用了强大的错误处理功能,因此我知道这个问题与 Adobe ColdFusion 无关。这绝对是 MURA CMS 问题。
不要删除 built-in 错误处理。他们已将其落实到位,以保护您免受信息泄露。而是更改错误处理以满足您的需要。
Mura 基本上带有三个级别的错误 "catching"。在主题级别,在站点级别,然后是全局级别。 (而且我发现,即使错误可能会在像 'site' 这样的较低级别被捕获,也不会阻止相同的错误冒泡并触发 'global' 处理程序。)
Steve Withington 创建了一个 Gist 示例,可以帮助您入门。 See it here。请务必阅读代码中的注释,因为它解释了文件所在的位置以及调用它们所需的任何配置设置。
在此处复制他的代码示例以防将来资源被删除。
Credit Steve Withington
Mura Error Handling: You could use any or even both of the attached methods to help with error handling in Mura CMS. This works better than the default "We're sorry, an error has occurred. Please try again later."
muraCustomErrorFile.cfm
<!---
1) Drop this file under /config/ directory.
2) Add errortemplate=/muraWRM/config/customErrorFile.cfm to the settings.ini.cfm file.
3) Set debuggingenabled=false in the settings.ini.cfm file.
4) Reload Mura CMS
--->
<cftry>
<cfset msg = 'MURA ERROR - MESSAGE: #arguments.exception.Message# DETAIL: #arguments.exception.Detail# ' />
<cflog type="ERROR" file="MuraError" text="#msg#" />
<cfcatch></cfcatch>
</cftry>
<cfparam name="url.debug" default="false" />
<cfoutput>
<!DOCTYPE html>
<html>
<head>
<title>Site Down For Maintenance</title>
</head>
<body>
<h3>Site Down for Maintenance</h3>
<cfif url.debug>
<cfdump var="#arguments#" />
<!--- You Have Access to arguments.eventName and aguments.exception --->
<!---
<h4>Exception Message</h4>
<p>#arguments.exception.message#</p>
<h4>Exception Detail</h4>
<p>#arguments.exception.detail#</p>
<h4>TagContext[1]</h4>
<cfdump var="#arguments.exception.TagContext[1]#" />
--->
<!--- you could also dump whatever else you want to inspect --->
<!---
<cfdump var="#cgi#" label="CGI" />
<cfdump var="#request#" label="REQUEST" />
<cfdump var="#session#" label="SESSION" />
<cfdump var="#application#" label="APPLICATION" />
--->
<cfelse>
<p>This site is temporarily down for maintenance.</p>
</cfif>
</body>
</html>
</cfoutput>
muraOnGlobalError.cfm
<cfscript>
// drop this method in either the Site or Theme eventHandler.cfc
public any function onGlobalError($) {
var tagContext = '';
var local = {};
param name='url.debug' default=false;
local.ex = arguments.$.event('exception');
local.errorMessage = 'GLOBAL ERROR - MESSAGE: #local.ex.Message# DETAIL: #local.ex.Detail# ';
try {
tagContext = local.ex.TagContext[1];
} catch(any e) {};
if ( IsStruct(tagContext) ) {
local.errorMessage = local.errorMessage & '
LINE: #tagContext.LINE#
TEMPLATE: #tagContext.TEMPLATE#
RAW_TRACE: #tagContext.RAW_TRACE#';
}
WriteLog(type='ERROR', file='muraGlobalError', text='#local.errorMessage#');
if ( url.debug ) {
WriteOutput('<h2>Debug Output</h2>' & local.errorMessage);
WriteDump(var=arguments, label='ARGUMENTS', abort=1);
}
}
</cfscript>
谁能告诉我,如何在 MURA CMS 6 的主题级别 EventHandler.cfc
中启用异常处理?
我已经不得不删除 Application.cfc
错误方法中的错误处理,因为默认例程没有显示足够的错误详细信息。但是,似乎整个 CFC 框架都包裹在一个 <CFTRY>
块中,坦率地说,这很奇怪。
我更喜欢不涉及使用 <CFCATCH>
将错误转储到文件的解决方案,这是我目前正在使用的临时解决方案。
我只希望 Adobe ColdFusion 的行为方式与我的非 MURA 网站相同。当 CFC 中出现错误时,它会简单明了地显示出来。
当然,对于生产,我的做法是不同的。
更新:
特此通知您,我使用的是 Adobe ColdFusion 11,启用了强大的错误处理功能,因此我知道这个问题与 Adobe ColdFusion 无关。这绝对是 MURA CMS 问题。
不要删除 built-in 错误处理。他们已将其落实到位,以保护您免受信息泄露。而是更改错误处理以满足您的需要。
Mura 基本上带有三个级别的错误 "catching"。在主题级别,在站点级别,然后是全局级别。 (而且我发现,即使错误可能会在像 'site' 这样的较低级别被捕获,也不会阻止相同的错误冒泡并触发 'global' 处理程序。)
Steve Withington 创建了一个 Gist 示例,可以帮助您入门。 See it here。请务必阅读代码中的注释,因为它解释了文件所在的位置以及调用它们所需的任何配置设置。
在此处复制他的代码示例以防将来资源被删除。
Credit Steve Withington
Mura Error Handling: You could use any or even both of the attached methods to help with error handling in Mura CMS. This works better than the default "We're sorry, an error has occurred. Please try again later."
muraCustomErrorFile.cfm
<!---
1) Drop this file under /config/ directory.
2) Add errortemplate=/muraWRM/config/customErrorFile.cfm to the settings.ini.cfm file.
3) Set debuggingenabled=false in the settings.ini.cfm file.
4) Reload Mura CMS
--->
<cftry>
<cfset msg = 'MURA ERROR - MESSAGE: #arguments.exception.Message# DETAIL: #arguments.exception.Detail# ' />
<cflog type="ERROR" file="MuraError" text="#msg#" />
<cfcatch></cfcatch>
</cftry>
<cfparam name="url.debug" default="false" />
<cfoutput>
<!DOCTYPE html>
<html>
<head>
<title>Site Down For Maintenance</title>
</head>
<body>
<h3>Site Down for Maintenance</h3>
<cfif url.debug>
<cfdump var="#arguments#" />
<!--- You Have Access to arguments.eventName and aguments.exception --->
<!---
<h4>Exception Message</h4>
<p>#arguments.exception.message#</p>
<h4>Exception Detail</h4>
<p>#arguments.exception.detail#</p>
<h4>TagContext[1]</h4>
<cfdump var="#arguments.exception.TagContext[1]#" />
--->
<!--- you could also dump whatever else you want to inspect --->
<!---
<cfdump var="#cgi#" label="CGI" />
<cfdump var="#request#" label="REQUEST" />
<cfdump var="#session#" label="SESSION" />
<cfdump var="#application#" label="APPLICATION" />
--->
<cfelse>
<p>This site is temporarily down for maintenance.</p>
</cfif>
</body>
</html>
</cfoutput>
muraOnGlobalError.cfm
<cfscript>
// drop this method in either the Site or Theme eventHandler.cfc
public any function onGlobalError($) {
var tagContext = '';
var local = {};
param name='url.debug' default=false;
local.ex = arguments.$.event('exception');
local.errorMessage = 'GLOBAL ERROR - MESSAGE: #local.ex.Message# DETAIL: #local.ex.Detail# ';
try {
tagContext = local.ex.TagContext[1];
} catch(any e) {};
if ( IsStruct(tagContext) ) {
local.errorMessage = local.errorMessage & '
LINE: #tagContext.LINE#
TEMPLATE: #tagContext.TEMPLATE#
RAW_TRACE: #tagContext.RAW_TRACE#';
}
WriteLog(type='ERROR', file='muraGlobalError', text='#local.errorMessage#');
if ( url.debug ) {
WriteOutput('<h2>Debug Output</h2>' & local.errorMessage);
WriteDump(var=arguments, label='ARGUMENTS', abort=1);
}
}
</cfscript>