Переменные холодного синтеза в cftry не сохраняются - PullRequest
4 голосов
/ 04 апреля 2019

У меня есть <cftry вне тега <cfmail. В пределах <cftry установлена ​​переменная x. Переменная x не сохраняется после </cftry>.

<cfoutput>
<cftry>
<cfmail

          from     = "user@example.org"  
          to       = "other@example.org"          
          password = "something"
          username = "user@example.org"     
          server   = "localhost"                            
          replyto  = "user@example.org"
          subject  = "try-catch"               
          type     = "html"   >   

  <cfset x = 'abc'>

  this is to test email
  </cfmail>
  success

  <cfcatch>
  <cfoutput> email failed </cfoutput>
  </cfcatch
</cftry>


<!--- there is no variable x --->
x is #x#
</cfoutput>

Я хотел бы найти способ подобрать значение x после окончания <cftry. Я пытался установить его с различными областями внутри <cftry

<cfset register.x = 'abc'>  or even
<cfset session.x = 'abc'>

Но ни один из них не сохраняет х вне <cftry>. Может кто-нибудь предложить способ сохранить х за пределами </cftry>?

1 Ответ

11 голосов
/ 04 апреля 2019

Похоже, у вас неправильное представление об обработке исключений.Код в 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>, чтобы сохранить исходное исключение, вместо того, чтобы молча воспринимать истинную причину ошибки.

...