1

谁能告诉我,如何EventHandler.cfc在 MURA CMS 6 的主题级别启用异常处理?

我已经不得不删除Application.cfc错误方法中的错误处理,因为默认例程没有显示足够的错误细节。但是,整个 CFC 框架似乎被包裹在一个<CFTRY>块中,坦率地说这很奇怪。

我更喜欢不涉及使用<CFCATCH>将错误转储到文件的解决方案,这是我目前正在使用的临时解决方案。

我只是希望 Adob​​e ColdFusion 的行为方式与我的非 MURA 网站一样。当 CFC 中出现错误时,它只会显示它,简单明了。

当然,对于生产,我的方法是不同的。

更新:

只是为了让您知道,我使用的是 Adob​​e ColdFusion 11,并打开了强大的错误处理功能,所以我知道这个问题与 Adob​​e ColdFusion 无关。这绝对是一个 MURA CMS 问题。

4

1 回答 1

2

不要删除内置的错误处理。他们已将其落实到位,以保护您免受信息泄露。而是对错误处理进行更改以满足您的需求。

Mura 基本上带有三个级别的错误“捕捉”。在主题级别,在站点级别,然后在全球范围内。(而且我发现即使可能在较低级别(例如“站点”)捕获错误,也不会阻止相同的错误冒泡并触发“全局”处理程序。)

Steve Withington 创建了一个 Gist 示例,可以帮助您入门。在这里看到它。请务必阅读代码中的注释,因为它解释了文件所在的位置以及调用它们所需的任何配置设置。

在这里复制他的代码示例,以防将来该资源被删除。
信用史蒂夫威辛顿

Mura 错误处理:您可以使用任何一种或两种附加方法来帮助在 Mura CMS 中进行错误处理。这比默认的“我们很抱歉,发生错误。请稍后再试”效果更好。

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>
于 2018-03-16T12:01:51.030 回答