Разрешить уровню темы EventHandler.cfc вызывать исключения в MURA CMS 6?
Может кто-нибудь сказать мне, как я могу включить обработку исключений на уровне темы EventHandler.cfc
в MURA CMS 6?
Я уже должен был удалить обработку ошибок в Application.cfc
метод ошибки, потому что стандартная процедура не отображала достаточно подробностей об ошибке. Но, похоже, вся структура CFC обернута в <CFTRY>
блок, который, откровенно говоря, является странным.
Я бы предпочел решение, которое не связано с использованием <CFCATCH>
сбросить ошибки в файл, который является временным решением, которое я использую в данный момент.
Я просто хочу, чтобы Adobe ColdFusion вел себя так же, как и на моих сайтах, не принадлежащих MURA. Когда есть ошибка в CFC, он просто отображает ее, просто и понятно.
Конечно, для производства мой подход отличается.
ОБНОВИТЬ:
Просто чтобы вы знали, я использую Adobe ColdFusion 11 с включенной надежной обработкой ошибок, поэтому я точно знаю, что эта проблема не имеет ничего общего с Adobe ColdFusion. Это определенно проблема MURA CMS.
1 ответ
Не удаляйте встроенную обработку ошибок. Они создали это, чтобы защитить вас от раскрытия информации. Вместо этого внесите изменения в обработку ошибок в соответствии с вашими потребностями.
Мура имеет в основном три уровня "ловли" ошибок. На уровне темы, на уровне сайта, а затем и на глобальном уровне. (И я обнаружил, что даже на более низком уровне, таком как "site", может быть обнаружена ошибка, которая не препятствует тому, чтобы та же самая ошибка всплывала, а также запускала "глобальный" обработчик.)
Стив Витингтон создал пример 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>