Похоже, у вас неправильное представление об обработке исключений.Код в try
выполняется полностью, только если нет исключения.Как только возникает исключение в пределах try
, выполнение останавливается и переходит к catch
.
Пример 1
<cftry>
<cfset x = "everything is ok">
<cfcatch>
<cfset x = "an exception occured">
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
Это всегда будет выводить everything is ok
, потому чтокод в try
может быть выполнен без исключения.
Пример 2
<cftry>
<cfthrow message="I fail you!">
<cfset x = "everything is ok">
<cfcatch>
<cfset x = "an exception occured">
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
Это всегда будет выводить an exception occured
, потому что код в try
выполняется только дляточка, где выдается исключение (мы делаем это специально здесь с <cfthrow>
).
Пример 3
<cftry>
<cfset x = "everything is ok">
<cfthrow message="I fail you!">
<cfcatch>
<cfset x = "an exception occured">
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
Это все равно будет выводить an exception occured
.Хотя оператор <cfset x = "everything is ok">
был правильно выполнен и установил переменную x
, мы все еще переходим к catch
из-за возникновения исключения.
Пример 4 (это ваша проблема!)
<cftry>
<cfthrow message="I fail you!">
<cfset x = "everything is ok">
<cfcatch>
<!--- we are doing nothing --->
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
Это вызовет ошибку времени выполнения, сообщающую, что x
не определено.Зачем?Потому что оператор, объявляющий x
, никогда не достигается из-за возникновения исключения.И уловка также не вводит переменную.
Короткая история
Ваш <cfmail>
вызывает исключение, и <cfset x = 'abc'>
никогда не достигается.
Исправление
Правильная обработка ошибок означает полную обработку обнаруженных исключений.Не выходите из этого и ведите себя так, как будто вам все равно.Зарегистрируйте исключение (для этого есть <cflog>
) и просмотрите его.В целях отладки вы можете использовать <cfrethrow>
в пределах <cfcatch>
, чтобы сохранить исходное исключение, вместо того, чтобы молча воспринимать истинную причину ошибки.