Как вы фиксируете ошибки для всего приложения в ColdFusion?
В настоящее время я пытаюсь зафиксировать все ошибки в моем приложении, добавив следующий код в Application.cfc:
<cffunction name="onError">
<!--- The onError method gets two arguments:
An exception structure, which is identical to a cfcatch variable.
The name of the Application.cfc method, if any, in which the error
happened. --->
<cfargument name="Except" required=true/>
<cfargument type="String" name = "EventName" required=true/>
<!--- Log all errors in an application-specific log file. --->
<cflog file="#THIS.NAME#" type="error" text="Event Name: #Eventname#" >
<cflog file="#THIS.NAME#" type="error" text="Message: #Except.message#">
<!--- Throw validation errors to ColdFusion for handling. --->
<cfif Find("coldfusion.filter.FormValidationException", Arguments.Except.StackTrace)>
<cfthrow object="#Except#">
<cfelse>
<cfoutput>
<h1>#Eventname#</h1>
</cfoutput>
<cfdump var="#Except#">
</cfif>
</cffunction>
Часть этого заимствована из других примеров, которые я видел (что я не до конца понимаю). В конечном итоге я хочу показать какую-то изящную страницу с ошибкой, чтобы запросить обратную связь от пользователя, а затем записать / отправить по электронной почте сообщение об ошибке. Это, кажется, ловит много ошибок, но не все. Я не хочу использовать try / catch везде, если мне это не нужно. Какие-либо предложения?
3 ответа
Существует также общий обработчик ошибок ColdFusion, который вы можете определить в администраторе ColdFusion. В разделе "Настройки сервера"> "Настройки" прокрутите вниз и установите параметр "Обработка ошибок всего сайта".
Проверьте это также в документации Об обработке ошибок в ColdFusion
Использование общего хостинга не должно быть проблемой, просто спросите своего хостера, что это за шаблоны ошибок, если они знают о cf, то они их настроят. Для примера используйте файлы error.cfm и 404.cfm, которые находятся в корне сайта каждого клиента.
Метод "OnError" в Application.cfc будет перехватывать только те ошибки, в которых они ранее не были обнаружены пользовательским оператором try / catch.
http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=appFramework_13.html
С учетом сказанного, я думаю, что было бы хорошей идеей иметь операторы try в вашем коде, где это необходимо (ситуации, когда вы не можете изящно ухудшить качество). Что мне нравится делать, так это создавать экземпляр cfc, который оборачивает всю обработку исключений. Этот код может содержать действительную логику обработки ошибок, и все, что нужно сделать методу OnError, - создать экземпляр правильного компонента и "контролировать" ошибку.
Очень простая иллюстрация:
<cfscript>
/** Application.cfc **/
public function onError(required exception, required string eventName)
{
var factory = new App.ExceptionFactory();
var e = factory.getNewException(arguments.eventName, arguments.exception);
if (e.logError()) {
/** we cauld also have a logging cfc etc **/
var loggingFile = new App.SomeLoggingCfc(arguments.eventName, arguments.exception);
loggingFile.commitLog();
}
if (e.debugError()) {
// show developer info here
}
/** Throw the exception **/
e.throwException();
}
/** App.ExceptionFactory **/
public ExceptionFactory function getNewException(required string eventName, required exception)
{
return new "App.#exception.type#"(argumentCollection = arguments);
}
/** App.Exception.CustomException **/
public boolean function logError()
{
/** log the error **/
}
public boolean function debugError() {}
public function throwException()
{
/** do what you want here **/
}
</cfscript>